Check List



Cover Page

Under construction


Abstract

Under construction


Table of Contents

  1. Introduction
  2. Literature Review
  3. Data
  4. Methodology
  5. Results
  6. Discussion
  7. Conclusion
  8. Bibliography
  9. Appendix


Figures, Tables, and Abbreviations

Under construction



1. Introduction

In late 2019, a virus first detected in Wuhan, China would set in motion a global pandemic which, by the end of 2021, will have killed 4.3 million people, infecting 238 million others, and disrupting the global economy across virtually every measurable dimension (WHO 2021). According to seven economic impact models constructed by McKibbin and Fernando (2020), estimates of the total global economic loss in terms of GDP are measured to be as large as 9.2 trillion U.S. dollars. However, despite a generally positive correlation between GDP and real estate prices (see image 1), historically measured as high as 98%, real estate market prices in the U.S. hit near-record heights following the outbreak of COVID-19 (Anissanti 2021). According to a report released by Zillow Analytics (Manhertz 2021), U.S. real estate gained 2.5 trillion dollars of value in 2020 alone, representing the largest single-year growth since 2005, despite an approximately 760 billion dollar decrease in GDP in the same year (FRED 2021). The focus of this thesis is to investigate the reasons behind why and how real estate market prices have broken trend and behaved so uncharacteristically counter cyclical in the face of a global pandemic.



In the following sections, I will apply the Hedonic Pricing Method (HPM) to Louisiana housing market data in order to inferentially describe the economic impact of the global pandemic on residential housing market values. Furthermore, I will take advantage of the HPM’s structural framework of using real estate properties’ hedonic features (e.g., size, age, number of bedrooms, etc.) to test for changes in demand for specific property features pre vs post pandemic. The HPM will be econometrically modeled using an Ordinary Least Squares (OLS) regressions framework for specific variable analysis while several variations of machine learning (ML) prediction models will be estimated to test different independent variables’ maximum explanatory power in predicting out-of-sample observations. The results of these models will shed light into the otherwise counter intuitive response of real estate pricing dynamics to the COVID-19 global pandemic.



2. Literature Review

2.1 Background

The market value of a commodity is most often theoretically defined as the equilibrium price derived from the basic economic principal, or law, of supply and demand (Locke and Engels 1691; Epple 1987). However, the real estate market often violates this assumption due to its unique characteristics as an asset class (Wheaton 1999). For example, much of the underlying utility of a property is its use as a means of shelter by its owner (LING, OOI, and LE 2015). This rather unusual relationship to this asset introduces several behavioral biases which cause economic frictions not accounted for by traditional neoclassical economic theory (Nicolaides 1988). A notable example of behavioral bias impacting real estate price dynamics is the endowment effect. This behavioral finding was originally established by Kahneman, Knetsch, and Thaler (1990) in the late 20th century, and later applied to real estate markets by BAO and GONG (2016). The latter of the two stating that the predictably irrational behavior of market participants to overvalue their home due to sentimental attachment to the property forces market prices into sustained economic disequilibrium. Other highly cited and unusual characteristics are that real estate assets are very infrequently traded due to high transaction costs (Collett, Lizieri, and Ward 2003; Guilkey, Miles, and Cole 1989), governments tend to interfere, both directly and indirectly with real estate markets through the creation of fiscal and monetary policies (Bingyang, Jie, and Yinhan 2013; Du, Ma, and An 2011), and through creating renter-protections laws such as ‘squatter’s rights’ laws which allow a renter to remain in a home for extended periods of time long after they have stopped paying rent (Hoy and Jimenez 1991; Gardiner 1997).

2.2 Real Estate Valuation Methods

The idiosyncratic asset features outlined in section 2.1 along with a high level of heterogeneity across many dimensions of the entire real estate asset class makes the creation of a generalized pricing model difficult and have led to a wide range of proposals and recommendations about what determines the market price of real estate assets and how to reliably model those pricing dynamics (Curcuru et al. 2010). In Pagourtzi et al. (2003), the authors outlines several of the currently accepted real estate valuation methods, ranging from what they categorize as the traditional methods, such as comparable-group, cost, income-multiple, profit-multiple, and contractor’s method, to the advanced methods, such as ANNs, spatial analysis methods, fuzzy logic, and the hedonic pricing method. According to a meta analysis conducted by Sirmans et al. (2006), currently, the most widely used and accepted advanced methodological framework for real estate valuation modeling is the Hedonic Pricing Method.

2.2.1 Hedonic Prcing Model in Real Estate

First applied in 1939 on automobile data, according to Goodman (1978), the HPM is a model which estimates the value of distinct characteristics of a commodity which directly or indirectly contribute to its market value. Besides its implementation in real estate finance and economics, such as in this thesis, this methodology has a wide range of applications such as its implementation in consumer and market research (Holbrook and Hirschman 1982; Arnold and Reynolds 2003), construction of consumer price indices (Moulton 1996; Schultze 2003), various tax assessments (Berry and Bednarz 1975; Bernasconi, Corazzini, and Seri 2014), automated automobile valuation (Cowling and Cubbin 1972; Matas and Raymond 2009), and computer sales (Dulberger 1987; Wakefield and Whitten 2006).

Since its introduction, the HPM has gain significant popularity among housing market and commercial real estate researchers. The specific real estate-based topics include, but are not limited to, the construction of housing price indices (Gouriéroux and Laferrère 2009; Wallace and Meese 1997), the estimation and prediction of a property’s market value in situations where market-transaction data is low-dimensional or non-existent (LeSage and Pace 2004), and, as in this thesis, the specific analysis of changes in the demand for specific property characteristics across time, subgroups, or both (Clapp and Giaccotto 1998). As the broad search for a satisfactory modeling framework focuses in on the HPM, another debate arises regarding the best functional form of this method. Traditionally utilizing the standard OLS framework (Pace and Gilley 1998), researchers are increasingly utilizing a variety machine learning algorithms to accomplish an increasingly more refined set of findings.

2.2.2 OLS and the Hedonic Pricing Model in Real Estate

Unsurprisingly, regression analysis is the preferred estimation approach among real estate researchers when using HPT for price estimation. These multiple regression analysis methods are most often either an Ordinary Least Squares (OLS) regression or a Maximum Likelihood approximation of the log-likely equation derived directly from the hedonic function. Each of these estimation methods take a functionally similar path as they both estimate a vector of parameters (i.e. beta coefficients) that best fits the explanatory hedonic variables to the associated market price. They differ only by the loss function used in the identification of that best-fitted parameter vector.

The most commonly used hedonic price regression equation with respect to real estate markets models the relationship between market rents or market property values to a list of hedonic characteristics. The classical construction of this model according to (Herath, S. K. & Maier, G. (2010)) is the following:

\[ R = f(P,N,L,t) \] where \(R\) is rent or price of the property; \(P\) is property related attributes; \(N\) is neighborhood characteristics; \(L\) is locational variables and; \(t\) is an indicator of time.

2.2.3 Machine Learning and the Hedonic Pricing Model in Real Estate

Though first introduced by Turing (1950) under the broader umbrella term of artificial intelligence, the adoption of ML methods in real estate would take many years of software and hardware development, allowing or the subsequent collection of ever-larger data sets and central processing unites (CPUs) capable of processing the often extraordinary number of calculation required to produce a solution for a given algorithm (Dutta 2018). The primary advantage of ML techniques are that ML algorithms learn and improve over time and across many iterations and variable combinations, while tradition statistical and econometric techniques produce static results across a single model (Anguita et al. 2010).

Mohd et al. (2020) provides a thorough overview of the various applications of ML to real estate valuation methods, including the Ridge and Lasso regression techniques used in this thesis.

Work in Progress: Add more volume here. Possible addition of models?


2.3 COVID-19 Crisis’ Impact on Real Estate Markets

In the wake of the COVID-19 crisis, there were several papers and articles regarding the economic impact of the global pandemic on the housing market being expeditiously publishes in virtually every major journal. In this section (2.3), I have selected the most relevant of these publications with respect to this thesis.

Structural and temporal changes in the housing market using hedonic methods (Shimizu et al. 2010),

Changes in housing market demand for specific property types and features (Tajani et al. 2021),

Potential changes in housing preferences due to the COVID-19 pandemic and highlight the challenges for policy making (Nanda et al. 2021)


Tonia Notes:

  • Add multiple sources on some citations
  • Add real estate market during the crisis
  • Break into subsections from widest to most specific
    • Make last subsection specific to this thesis, quoting sources and their findings
  • Meta analysis is good



3. Data

3.1 Data Collection

The utilization of Big Data collected through a data-mining process called web-scrapping has increasingly become the method of choice for researchers across disciplines. The term web-scrapping simply refers to the process of collecting structured data from websites using algorithms to automate the collection process. Methods similar to ones I have implemented in this thesis have been used by established authors such as Borde et al., Pérez-Rave et al. and Berawi et al.

In this thesis, I have used a mixture of the programming languages R and Python, supplemented by several packages created by Selenium, to write an algorithm that collects the required hedonic variables for this research from the Multiple Listing Services (MLS). Table 1 is a summary of the original data set’s key features.


Variable List
Structure and short discription
Name Information
Date Range 23.10.2010 - 12.12.2021
Location Louisiana, USA
Number of Variables 49
Number of Observations 31,280
Pre-Corona Obs 6,256
Post-Corona Obs 25,024


Variable List
Structure and short discription
Variable Type Variables Observations
Continuous 11 31184
Factor 38 31280
Nominal Total 49 31280
Factor-Expanded Total 114 31280

3.2 Data Processing

Though the data-collecting algorithms return structured data, it is nevertheless far from being suitable for the rather picky models which will eventually analyze them. Therefore, the following processes were completed in order to render the raw data into a usable form:

  1. Missing values (i.e. N/A values) were removed
  2. Outliers were identified and removed for all continuous variables
    • An ‘outlier’ is defined by being more than 1.5 standard deviations from the mean of the variable’s own distribution
  3. Multilevel factor data was broken out by each level into binary representations through Hot-One coding
    • Some features which had a large number of factor levels were simplified using Lasso regressive methods
  4. High-leverage point observations, according to diagnostic linear regression, were removed
  5. Duplicates, defined by the MLS unique identification number, were removed
  6. Structural errors (e.g. dates structured as string variable) were corrected
  7. Binary variables were created for key variables (e.g. city_limits) by the following standard method:

\[I\left(y\right)=\left\{\begin{array}{ll}1,\quad x\in A\\0, \quad x \notin A\end{array}\right.,\] Where \(I\) is an indicator function with space \(A\) that composes dummy variable \(x\) into \(1\) if the condition is met and into \(0\) if it is not.


The results of the data cleaning processes cane be seen in table 2.

Variable List
Structure and short discription
Name Raw Clean
Date Range 23.10.2010 - 12.12.2021 23.10.2010 - 12.12.2021
Location Louisiana, USA Louisiana, USA
Number of Variables 49 49
Number of Observations 31,280 24,412
Pre-Corona Obs 6,256 4,882
Post-Corona Obs 25,024 19,529


Variable List
Structure and short discription
Variable Type Variables Observations
Continuous 11 24412
Factor 38 24412
Nominal Total 49 24412
Factor-Expanded Total 103 24412

3.3 Variable List

Variable List
Structure and short discription
Count Name Structure Discription
1 list_price Number Original listing price
2 photo_count Number Number of photos on listing
3 area_living Number Total living area in sqft.
4 land_acres Number Size of land in acres
5 area_total Number Total area in sqft.
6 age Number Age of property
7 dom Number Days on the market
8 sold_price Number Actual sold price
9 infections_daily Number Daily public corona infections
10 infections_accum Number Accumulation of public corona infections
11 infections_3mma Number 3-month moving average of daily public corona infections
12 sold_date Date Date on which the property was sold
13 beds_total Factor Total number of beds
14 bath_full Factor Total number of full bathrooms
15 bath_half Factor Total number of half bathrooms
16 property_type Factor Property type
17 property_condition Factor Property condition
18 property_style Factor Property Style
19 roof_type Factor Roof type
20 patio Factor Patio present
21 out_building Factor Detached building (e.g. shed) present
22 city_limits Factor Property within city limits
23 mls_number Factor MLS number (unique ID)
24 ac_type Factor Air conditioning type
25 school_general Factor School in city limits
26 pool Factor Pool present
27 gas_type Factor Gas type
28 appliances Factor Appliances included
29 garage Factor Garage present
30 energy_efficient Factor Energy-efficient features present
31 exterior_type Factor Exterior type
32 exterior_features Factor Exterior features
33 fireplace Factor Fireplace present
34 foundation_type Factor Foundation type (e.g. slab)
35 sewer_type Factor Sewer type
36 subdivision Factor Property within subdivision
37 water_type Factor Water supply type
38 waterfront Factor Property has waterfront
39 corona_date_split Factor Date of first mandatory lockdowns in Louisiana (i.e. 23.03.2020)
40 top25_sold_price Factor Top 25th percentile of sold price
41 top50_sold_price Factor Top 50th percentile of sold price
42 bottom25_sold_price Factor Bottom 25th percentile of sold price
43 top25_area_living Factor Top 25th percentile of total living area
44 bottom25_area_living Factor Bottom 25th percentile of Living area
45 top25_age Factor Top 25th percentile of total age
46 bottom25_age Factor Bottom 25th percentile of age
47 top25_dom Factor Top 25th percentile of days on market
48 bottom25_dom Factor Bottom 25th percentile of Days on Market
49 infections_period Factor Period after accumulated infections > 1000 cases



3.3 Data Distriptive Statistics

3.3.1 Correlation

The correlation matrix between all numeric variables shows that with exception to the variables which will have obvious correlations (e.g. sold_price and list_price, area_total and area_living, and infections figures), there are no other correlations which would cause concern.



3.3.2 Distributions of Select Variables

As the standard descriptive characteristics of a particular variable are considered (i.e. measures of frequency, central tendency, dispersion, and position), the matrix of density plots below give us a good overview of the most relevant variables in this data set.


3.3.3 Price Index

Under Construction



4. Methodology

The overarching method used in this thesis is the Hedonic Pricing Method (HPM), also often referred to as hedonic regression or hedonic demand theory. The fundamental theory behind the HPM is the following: commodities are distinguishable by their component parts, therefore, the market value of a given commodity can be calculated by summing the estimated values of its separate characteristics. For this theory to hold true, several critical requirement must be met. Primarily, that the commodity being valued can be reduced down to it’s component parts and that the market is able to implicitly and independently value these characteristics. The fulfillment of these requirements are not obvious and in reality will in some measure fall short of accounting for the complete nature of price dynamics in practically every asset class. However, this limitation offers an interesting problem to test. Namely, to find the limit of the accumulated power of these component parts to account for market values and their deviations across time and subgroups. This exact questions will be later examined by implementing a machine-learned predictive model to measure the theoretical maximum explanatory power of the included hedonic variables. In the following two subsections, we review the methods used in this paper to econometrically model the HPM on hedonic real estate data.


4.1 Multi-Variable Linear Regression

In this section, I will outline the construction of my base OLS model, termed the Alpha model, as well as the treatment process for heteroskadasticity, multicolinearity, non-linearity, and high-leverage points and outliers.

4.1.1 Basic Model Design

Following the OLS construction laid out by Herath and Maier (2010):

\[ R = f(P,N,L,t) \] where \(R\) is rent or price of the property; \(P\) is property related attributes; \(N\) is neighborhood characteristics; \(L\) is locational variables and; \(t\) is an indicator of time.

This paper’s base OLS model, named the Alpha model, is as follows:

\[ {P}_{n\times1} = \ A_{n\times1} \ + \ B_{k\times1}{V}_{n\times k} \ + \ \mathcal{E}_{n\times1} \]

where \(P\) is a \({n\times1}\) vector of sold prices; \(A\) is a \({n\times1}\) vector of the model’s intercepts; \(B\) is a \({k\times1}\) vector of beta coefficients; \(V\) is a \({n\times k}\) matrix of all hedonic variables; \(\mathcal{E}\) is a \({n\times1}\) vector of the model’s random error; subscript \(n\) is the number of observations and; \(k\) is the length of the variable list.


4.1.2 Accounting for Heteroscadasticity

A Breusch-Pagan test was conducted on a standard linear regression model with sold price as the dependent variable and the rest of the dataset as regressors. The Breusch-Pagan (BP) test was established as a method in 1979 and follows the logic set by the Lagrange multiplier test principle (Breusch and Pagan 1979). This test tests the null hypothesis that the variance in the model’s errors is independent from model’s regressors (i.e. heteroscadasticity). The test’s results in a rejections of the null hypothesis, thereby finding the base model to be heteroskedastic. The results of this test are summarized in table x.


Breusch Paga Test for Heteroskedasticity
Hypotheses
Hypotheses Test Summary
Hypotheses Test Summary -
Ho: the variance is constant DF 1
Ha: the variance is not constant Chi2 850.4231
- Prob > Chi2 0.00


To resolve the heteroskadasticity found in §3.4.1, I will produce heteroskedasticity-consistent (HC) standard errors, also known as heteroskedasticity-robust standard errors, through the refined method established by econometrician Halbert Lynn White (White 1980).This process is as follows:

If the model’s errors \(u_{i}\) are independent, but have distinct variances \(\sigma _{i}^{2}\) then \(\Sigma =\operatorname{diag}(\sigma _{1}^{2},\ldots ,\sigma _{n}^{2})\) which can be estimated with \({\displaystyle {\widehat {\sigma }}_{i}^{2}={\widehat {u}}_{i}^{2}}\). This relationship produces the estimator found in White (1980):


\[ {\displaystyle {\begin{aligned}v_{\text{HCE}}\left[{\widehat {\beta }}_{\text{OLS}}\right]&={\frac {1}{n}}\left({\frac {1}{n}}\sum _{i}X_{i}X_{i}'\right)^{-1}\left({\frac {1}{n}}\sum _{i}X_{i}X_{i}'{\widehat {u}}_{i}^{2}\right)\left({\frac {1}{n}}\sum _{i}X_{i}X_{i}'\right)^{-1}\end{aligned}}}\] \[{\displaystyle {\begin{aligned}&=(\mathbb {X} '\mathbb {X} )^{-1}(\mathbb {X} '\operatorname {diag} ({\widehat {u}}_{1}^{2},\ldots ,{\widehat {u}}_{n}^{2})\mathbb {X} )(\mathbb {X} '\mathbb {X} )^{-1},\end{aligned}}}\]


where \(\mathbb{X}\) denotes the matrix of stacked \(X_i'\) values from the data. The estimator can be derived in terms of the generalized method of moments (GMM).

For the remainder of this thesis, all statements and figures regarding statistical significance will be referring to tests conducted with heteroskedasticity-consistent (HC) standard errors. As sample errors in my models will have equal variance and are uncorrelated, the least-squares estimates of each model’s beta coefficients are regarded as Best Linear Unbiased Estimators (BLUEs).


4.1.3 Accounting for Multicolinearity

Multicolinearity is measured using Variance Inflation Factors (VIF). The VIF of a predictor measures how accurately that variable can be predicted using all other variables. For context, the square root of a VIF represents the increase in standard error of the estimated coefficient with respect to the case when that given variable is independent of all other variables. Inline with current convention, all variables with a VIF larger than 5 are eliminated. A graphical representation of all variable multicolinearity, measured by VIF, is shown in image x.

This test resulted in the elimination of the variables list_price and area_total and there were highly multicolinear with sold_price and area_living respectively.



4.1.4 Accounting for Non-linearities

I visual analysis was conducted on all continuous variables and non-linear variables transformation were added to age and area_living

Age:

An analysis of age vs. sold price shows a well-established u-shaped pattern. In order to allow the OLS model to better capture this relationship, a new variable \(age^2\) is added to the model.

Image x shows the Partial Dependency Plot (PDP) of age within the Alpha model. This plots the marginal prediction of the Alpha model across the full range of age. When the scale of the y-axis is reduced, we see the slight curvature in Alpha model’s estimation of age effects. This addition improved \(R^2\) by \(.08\).



Living Area:

An analysis of living-area vs. sold price reveals a Sigmoid pattern between the two variables. In order to allow the OLS model to better capture this relationship, a new variable \(living \ area^2\) is added to the model.

Image x shows the Partial Dependency Plot (PDP) of \(living \ area^2\) within the Alpha model. This addition improved \(R^2\) by \(.06\).



4.1.5 Accounting for High-Leverage Points and Outliers

After the adjustments or the previous sections have been made, a panel of visualizations are run on the Alpha model. The results show no extreme outliers and only one high-leverage point (obs #23515), as shows by the residual vs. leverage plot in quadrant two of image X, which is removed in the final Alpha model. These results are mainly due to the previous removal of outliers in §3.2 and the overall quality of the data set.



4.1.6 Final Alpha Model

Under Construction

The Alpha model is the baseline OLS for this thesis and is rebust to heteroskadasticity, multicolinearity, non-linearities, high-leverage points and outliers. These high-level adjustment increase our confidence in the statistical tests results which follow



4.3 Modeling Changes in Demand for Hedonic Features

The focus of this thesis is how the Covid crisis impacted housing prices and the relative levels of demand for specific hedonic features. In the case where the HPM is in the OLS functional form, the beta coefficients of this model represent relative demand for each associated hedonic feature (Shimizu et al. 2010). For example, \(\beta_{pool = 1} =11,856\) is interpreted as the average consumer’s willingness to pay for an average pool, ceteris parabus. However, this thesis wishes to measure the changes in the average consumer’s willingness to pay for a given feature (e.g. pool) in relationship a measurement of Covid’s economic impact.

4.3.1 Comparison Method

A method of statistically comparing changes in the beta coefficients of particular features of interest under multiple scenarios (e.g. post and pre-corona period) is needed. To accomplish this, a method outlined by the UCLA Statistics department is implemented (Bruin 2011). The best way to understand this method is to see a simplest reproducible example.

Suppose we want to test the economic impact of Corona on the relative demand for swimming pools, \(\beta_{pool = 1}\) and \(pool\) respectively. Using the UCLA method, we test the null hypothesis \(H_0:\beta_{pool = 1,\ corona = 0} = \beta_{pool = 1,\ corona = 1}\) with the following OLS


\[ {sold \ price} = \alpha \ + \beta_1 {pool} \ + \ \beta_2 {corona} \ + \beta_3 {(pool \times corona)} \]

Which results in the following:



The interpretation of this simplified model’s estimates are:

  • Intercept: Intercept for \(pool = 0\)
    • The omited group
  • pool: Slope for \(pool = 1\)
    • The included group
  • infections period: \((\)Intercept \(infections \ period = 1)\) \(-\) \((\)intercept \(infections \ period = 0)\)
    • This can be seen by running individual regressions for each case
  • (pool*infections period): Slope for \(pool_{infections \ period = 1}\) \(-\) \(pool_{infections \ period = 0}\)
    • This estimate tests the null hypothesis \(H_0: \beta_{pool = 1,\ corona = 0} = \beta_{pool = 1,\ corona = 1}\)


Therefore, we say:

The average premium for a property having a swimming pool fell by $7,766.40 when compared to pre-corona levels, ceteris parabus. However, this finding is only significant at the p < 0.10 level.


4.3.2 Selecting a Corona Measurment

A good measurement variable for measuring the response of the market to the corona crisis must be a corona-related matric which is publicly available; common knowledge to the population and; is a reasonable measurement of future economic shifts. For this reason, data collected from the Louisiana Department of Health (LaDH 2022) was used to calculate the 3-month moving average of corona infections (infections_3mma).



This measurement fulfills the previously stated requirements of a good test measurement as it is purely related to the corona crisis, is publicly available, is assumed to be publicly known as it is reported across all major news stations daily, and perhaps most importantly, is the primary metric used to decide when mandatory lockdowns are instituted. For this thesis, it is assume the market is responding to some lagged value of daily infections which are being used by consumers to estimate the likelihood of future lockdowns and the stringency, and duration of current lockdowns. With this rational, infections_3mma is selected as the primary measurement of corona’s impact.



4.4 Machine Learning

4.4.1 Machine Learning Methods

In the previous subsection 4.1, it was stated that the multivariable regression models estimate a vector of parameters (i.e. beta coefficients) that best fit the explanatory hedonic variables to the associated dependent variable. Intuitively, the resulting fitted coefficient vector is fitted to the entire data set, and therefore, the loss function minimizes the error in the model’s ability to explain the very independent variable it was fitted to. In other terms, these results are ultimately limited to their inferential value within the exact context of the data set the model is trained on. If one is to establish a wider, more general relationship between dependent and independent variables that go beyond the context of the trained data set, supervised machine learning (ML) prediction models are an extremely powerful tool to do so. Though the models used in this thesis differ across several key processes, they each generally follow a similar logic:



4.4.2 Model Evaluation with Cross-Validation

In order to rank order models, we perform a process called Cross-Validation (CV). First, the full data set must be split into ‘test’ and ‘train’ (i.e. validation) subsets. Each ML model will be fitted to the train data set and it’s performance will be evaluated based the model’s ability to predicted out-of-sample observations in the test (validation) data set. In this way, these models are ranked based on their test mean squared errors (MSE). This process is often referred to as Cross Validation (CV). The two most commonly used CV methods are the Validation Set Approach and K-Fold Cross Validation.

The Validation Set Approach (VSA) is the simplest case of cross validation data splitting as it randomly splits the entire data set into train and test subsets based on a certain percentage split. For example, the researcher can choose to split the data set with a 80% training and 20% testing split. The estimation for the test MSE is simply the test error against the test data set.


Test MSE Estimation Equation

\[CV_{vsa} = MSE_{vsa}\]



The K-Fold CV method has increasingly been used by researches as it offers a more comprehensive cross validation process when compared to other methods. K-Fold CV is the process of randomly splitting the entire data set into k groups, or folds, each with approximately an equal number of observations. The first fold is held out and the model is trained on the remaining k-1 folds. This process is repeated k times, each time holding out a different fold until every fold has been treated as the validation set. Finally, this will results in k estimations of the model’s test error and the final estimation will be the average across all k model fits.


Test MSE Estimation Equation

\[CV_{k-fold} = \frac{1}{k}\sum_{t=1}^{k} MSE_i\]



4.4.4 Model Selection

For this thesis, ML models will be ranked based on two features: Accuracy, as measured by test MSE, and interpretability, qualitatively defined by the model’s ability to provide insights into to which features are relevant to the ability to make correct predictions, and by how much are they relevant.

Accuracy

Since a method of model fitting and evaluation has been established in the previous section through the process of Cross Validation, we now have a way to rank different models to each other based on their ability to estimate test MSE. With this feature, it is possible to compare several models to one another in terms of effectiveness in predictions. Five different ML models were build for this thesis with the following results:



Interpretability

A major criticism of ML models are their lack of interpretabilty, explaining how the model makes such accurate predictions. A prime example of this critique can be seen in Artificial Neural Networks (ANN) machines, which often use a large number of small nodes to sequentially generate a single prediction without any one of these nodes holding a clear interpretation as to which variables, or combination of variables, lead to a particular improvement in prediction. However, as ML methods become more commonly used, the demand for interpretation of these models has driven several useful interpretation methods across for a variety of models. These methods include interpretation for a single prediction, such as the Local Interpretable Model-agnostic Explanations (LIME), as well as generalized methods of measuring relative feature importance, which uses various techniques to determine the average contribution of each variable to the model’s ability to decrease its test MSE rate.

Of the models sampled, the eXtreme Gradient Boosting Machine, also referred to as XGBoost, outperforms the other models both in terms of having the lowest test MSE and having the best methods for detailed variable interpretation. For this reason, XGBoost is chosen as the primary ML model for this thesis


4.4.5 eXtreme Gradient Boosting Machine Algorithm

In order to understand the logic of XGBoost, one must first look at the compact, yet powerful algorithm behind its computation. In this section, I will lay out the mathematical formulation of the input, core algorithm, and final output of the XGBoost machine.


  1. Algorithm input: We start with a training set \({\displaystyle \{(x_{i},y_{i})\}_{i=1}^{N}}\), a differentiable loss function \(L(y, F(x))\), a number of weak learners (shallow trees) \(M\), and a learning rate \(\alpha\).

  2. Algorithm:

2.1 Initialize model with a constant value:

\[{\displaystyle {\hat {f}}_{(0)}(x)={\underset {\theta }{\arg \min }}\sum _{i=1}^{N}L(y_{i},\theta )}\]


2.2 For \(m = 1\) to \(M\):

2.2.1 Compute the ‘gradients’ and ’hessians \[{\displaystyle {\hat {g}}_{m}(x_{i})=\left[{\frac {\partial L(y_{i},f(x_{i}))}{\partial f(x_{i})}}\right]_{f(x)={\hat {f}}_{(m-1)}(x)}}\] \[{\displaystyle {\hat {h}}_{m}(x_{i})=\left[{\frac {\partial ^{2}L(y_{i},f(x_{i}))}{\partial f(x_{i})^{2}}}\right]_{f(x)={\hat {f}}_{(m-1)}(x)}}\]


2.2.2 Fit an original weak learner (e.g. shallow tree) using the training set \({\displaystyle \displaystyle \{x_{i},-{\frac {{\hat {g}}_{m}(x_{i})}{{\hat {h}}_{m}(x_{i})}}\}_{i=1}^{N}}\) by solving the following optimization problem:

\[{\displaystyle {\hat {\phi }}_{m}={\underset {\phi \in \mathbf {\Phi } }{\arg \min }}\sum _{i=1}^{N}{\frac {1}{2}}{\hat {h}}_{m}(x_{i})\left[-{\frac {{\hat {g}}_{m}(x_{i})}{{\hat {h}}_{m}(x_{i})}}-\phi (x_{i})\right]^{2}}\]

\[{\displaystyle {\hat {f}}_{m}(x)=\alpha {\hat {\phi }}_{m}(x).}\]


2.3 Update the model: \[{\displaystyle {\hat {f}}_{(m)}(x)={\hat {f}}_{(m-1)}(x)+{\hat {f}}_{m}(x).}\]


  1. Algorithm Output: \[{\displaystyle {\hat {f}}(x)={\hat {f}}_{(M)}(x)=\sum _{m=0}^{M}{\hat {f}}_{m}(x)}\]


4.4.6 XGBoost Model Fitting and Hyperparameter Tuning

In practice, when attempting to produce the most optimal results from an XGBoost machine, as is true with most other ML models, one must first transform the data set into an optimal form and then run set of hyperparameter tests to determine the appropriate level for each of the model’s basic structural rules (i.e. hyperparameters).

Since the XGBoost machine requires only numerical data, factor data must be converted into numerical levels which can be the used in the construction of decision trees. To accomplish this with the added complexity of some factor variables having more than two levels, I have used a method called One-Hot Encoding, which encodes each individual factor variable level into a vector containing ‘1’ if that factor and level are present, and ‘0’ if it is not. In this way, the dataframe is converted into a large matrix of continuous and binary columns.



Once the model is fitted to the data, the next procedure is to tune the hyperparameters which govern the algorithm’s learning process and therefore determine the resulting values of estimated parameters. To do this, a large grid of hyperparameters is created and then an individual model containing each unique combination of hyperparameter levels is generated and their resulting test MSE’s are ranked and analyzed. The results from this large grid search determine which combination of hyperparameters are optimal, and those hyperparameters are used in the final model. The search grid from this research was so large, it took my computer 78 hours to complete all of the calculation necessary for the full tuning process.


4.4.7 XGBoost Partial Dependency Plots

Partial dependency plots (PDP) shows relationship, or dependence, between the model’s response variable (i.e. \(sold \ price\)) and a chosen variable, or set of variables, of interests (VoI), resulting in the graphical representation of a variables marginal contribution to the machine’s prediction across the variable of interest’s entire range. In order to analyze the results of the XGBoost machine at the variable-by-variable level, I have generate a panel of four graphical partial dependency plots for each variable of interest. Thesis will be the following: Basic PDP plot, Individual Conditional Expectation (ICE) plots, PDP heatmap with VoI against corona infection, 3-dimensional PDP heatmap with VoI against corona infection.

Image XX shows an example of each graph





5. Hypothesis Construction

5.1 Covid-19: General Case

Hypothesis I: The Covid-19 crisis significantly increased housing prices

Reasoning: As many workers have perminantly shifted to remote work, the total utility of residential housing has increased, thereby increasing the price households are willing to pay. This price shift can be explained through measuring the changes if relative demand for specific hedonic features, such as bedrooms, size, age, and others.


5.2 Covid-19: Premium for Bedrooms

Hypothesis II: The Covid-19 crisis significantly increased demand-premiums for every level of bedrooms

Reasoning: As many workers have perminantly shifted to remote work, the premium for an additional bedroom is expected to increase across each level of total_beds as households need additional rooms for homeoffices and other activities.


5.3 Covid-19: Premium for City Centrality

Hypothesis III: The Covid-19 crisis impacted properties within city limits more than those not within city limits

Reasoning: As workers who live in city limits have jobs more likely to be compateble with remote work, such as jobs within the financial industry, home prices within city limits are disproporsionatly impacted by the shift to remote work.


5.4 Covid-19: Premium for Relative Price Levels

Hypothesis IV: The Covid-19 crisis impacted properties in the top 25th percentile of price more than the bottom 25th percentile

Reasoning: Households who live in the top 25th percentile of home prices are more likely to hold white-collar jobs, which are more likely to be made remote, which increases the premium willing to pay for additonal hedonic features.


5.5 Covid-19: Premium for Size

Hypothesis V: The Covid-19 crisis increased the premium for property size

Reasoning: Same as for hypothesis I


Hypothesis VI: The Covid-19 crisis impacted properties in the top 25th percentile of price more than the bottom 25th percentile

Reasoning: Households who live in the top 25th percentile of home sizes are more likely to hold white-collar jobs, which are more likely to be made remote, which increases the premium they are willing to pay for additonal hedonic features.


5.6 Covid-19: Premium for Age

Hypothesis VII: The Covid-19 crisis increased the premium for property age

Reasoning: As the volocity of home sales increase, the general relationship between property age and price is expected to be exasterbated as those upgrading houses will shit towards newer properties


Hypothesis VIII: The Covid-19 crisis impacted properties in the top 25th percentile of age more than the bottom 25th percentile

Reasoning: The premium for the youngest (i.e. newest) properties is expected to increase while the premium for the oldest properties is expected to decrease. As the market shifts towards newer properties, they must necissarily shift away from older properties.


5.7 Covid-19: Change in Days on Market

Hypothesis IX: The Covid-19 crisis significantly impacted the premium for days on market

Reasoning: As the volocity of home sales increase, more homes are sold faster, and therefore the number of days on the market becomes less of a predictor of quality since even lower quality and over-priced homes are sold more quickly.


Hypothesis X: The Covid-19 crisis impacted properties in the top 25th percentile of days on market more than the bottom 25th percentile

Reasoning: The premium for a property being sold within the top 25th percentile of days on market (DOM), i.e. the properties which sit on the market the logest, is expected to be disproportionately effected when compared homes which sold the fastest, as households elasticity of demand for specific characteristics decreses relative to price, it will take larger deviation in price and quality to make a home sell in the top 25th percentile of DOM



6. Results

This section will follow a clear and consistent structure for each subsection of results. Each hypothesis will have: A general overview of the characteristic being modeled and; model results with standard hypothesis conclusion(s).


6.1 Covid-19: General Case

6.1.1 Summary of Findings

Preliminary analysis of housing prices and daily infections reveals a positive historical relationship between these two key variables. This relationship is strongly supported by the XGBoost ML algorithm, which shows that a maximal reduction in predictions error is acheived by increasing the prediciton price at all levels of daily infections > 0, holding all other factors constant. XGBoost determines that from the 104 total variables, daily infections is the 19th most important variable in reducing price prediction error.

Furthermore, in the fully controlled Alpha model, the beta coefficient for daily infections suggests that each additional infection is associated with an average home price increase of $8.97, ceteris parabus. This finding is significant at the p < 0.00 level.

6.1.2 Visual Review

We first look at the distribution of daily infections and the accumulation of infections across time. The variation in historical daily infections should provide a strong measurement for explaining variations in price related to this key variable.



Looking at the raw historical relationship between infections rates and prices, we look at the trend line of price vs daily infections (rhs) and a comparison between the price distributions of pre and post-infections period (lhs), we see historically positive relationship between infections and price. Though these graphs are promising, it is unclear if other factors could be influencing this relationship. To establish



6.1.3 OLS Modeling

Since displaying the full OLS output for ever section is impractical, I will include a summarized version with the only the key variables included. Please note that if you wish to see each regression output table, code, and data associated with this thesis, you can visit my GitHub repository with the following link: https://github.com/Sawbenson15/HPM_Thesis.

In the fully controlled Alpha model, the beta coefficient for daily infections shows that each additional infection is associated with an average home price increase of $8.97, ceteris parabus. This finding is significant at the p < 0.00 level

This foundational finding lays the groundwork for the following results, which attempt to explain the significant relationship between infections and price at the level of individual hedonic variables.




The following graphic shows the historical trend line for infection vs sold price with 1SD error margins (grey), the best single-variable fit (green), and the marginal fit of the Alpha model (blue). We see that the controls of the Alpha model have flatten the marginal effect of each additional infection on price, however, this relationshiip remains positive and significant, as previously established.



6.1.4 ML Modeling

To further test the relevance of corona infections in determining prices, we look at this variable’s relative ranking based it’s ability to improve out-of-sample predictions within our XGboost model. This measurment is called Variable Importance.

We see that of the 104 unique variables offered to the XGBoost machine, the 3-month moving average of infection was the 19th most descriptive variable in predicting prices. This is an very strong confirmation that the relationship found in the OLS model is correct.


To get a detailed understanding of the marginal effect each additional infection has on price through, we look at the PDP and the ICE of infections and price. The PDP (top) shows the optimal price change w.r.t. daily infections which minimize the model’s test MSE. The ICE (bottom) is the individual PDP for every observation in the dataset, centered at infection = 0. This allows us to understand the simple PDP in more detail and also to pick up on any signs of heteroskedasticity amoung individual sample predictions.

The PDP shows that on average, an increase in price at every level of daily infections > 0 reduces test MSE. Furthermore, this trend is generally upward facing, with a notable range of response between 1,800 and 2,500 infections, which I refered to as the infections-price ridge. Discussions regarding possible explanations for the general shape of this region will be explored in section 7.



6.2 Covid-19: Premium for Bedrooms

6.2.1 Summary of Findings

There are two contextual details which must be considered for one to appropriatly interpret the following findings. First, number of bedrooms and the total living area of a home are highly correlated, and therefore when total living area is included, the beta coefficients for each level of bedroom represents only the premium homeowners are willing to pay for the actual feature of an extra bedroom, and not the extra living area itself. This will make premiums seem low. Secondly, the OLS results listed below represent the change in the beta coefficients from post and pre corona, not the absolute effect, as in the case of measuring daily infection alone.

Prelimilary finding show that the price distribution for every level of number of bedrooms increased after the beginning of the infection period (i.e. accumulation of infections >= 1000)

The fully controled Alpha model results show that the premium for each level of number of bedrooms modestly increased in response to daily infection. Every corona-driven increase is significant at the p < 0.05 level except for single bedroom homes. Possible theories for why this shift happened is explored in section 7.

6.2.2 Visual Review

General distribution of bedrooms per house



Distributions of price at each number of bedrooms (lhs) and the same plot but split or before and after infections period (rhs)



However, it is important to remember that size (i.e. total living area) is controlled for in the Alpha model. Therefore, it is more accurate to look at the same two plots above, but normalized per square foot. We see a significant flattening between each number of bedrooms level, however, a distinct change from pre vs post infection period is still visible (rhs). The next section will test if this shift from post to pre-corona is significantly in general, and significantly related to daily infections.



6.2.3 OLS Modeling

Interpretation under construction



6.2.4 ML Modeling

Due to number of bedrooms being categorical, the results of the XGBoost model for these variables are not as easily visually represented as continuous variables, which have celar PDPs. However, we can consider the results in written form and with importance ranking.

The variable importance ranking of each factor level from 1-through-5 bedrooms is 84, 60, 47, 34, and 68 respectively. This relatively low relevance is expected, as much of the explanatory power of bedrooms on price is taken by total living area, ranked number 1 in importance.


6.3 Covid-19: Premium for City Centrality

6.3.1 Summary of Findings
6.3.2 Visual Review


Below we see a leftward shift of the price distribution for properties that are located within city limits (rhs).


To better understand the effect corona had on properties specifically located within city limits, we further split the city_limits distribution by infection periods. This separation shows a clear




6.3.3 OLS Modeling



6.3.4 ML Modeling



6.4 Covid-19: Premium for Size

6.4.1 Summary of Findings
6.4.2 Visual Review

Total living area





6.4.3 OLS Modeling





6.4.4 ML Modeling





6.5 Covid-19: Premium for Age

6.5.1 Summary of Findings
6.5.2 Visual Review



6.5.3 OLS Modeling



6.5.4 ML Modeling




6.6 Covid-19: Change in Days on Market

6.6.1 Summary of Findings
6.6.2 Visual Review



6.6.3 OLS Modeling





6.6.4 ML Modeling





6.7 Summary of Results and Hypothesis



7. Discussion



8. Conclusion



9. Bibliography



9. Appendix



General Notes and Todos

  • Possibly write in LaTex?
  • Just write cover letter in word and combine PDF?
  • Complete general Structure
  • Select system for managing references
  • Get confirmation on title change from Prüfungsamt
  • Possible additional data
    • Include Covid cases in La by date?
    • Crime stats?
    • Racial Stats?
  • Include the terms
    • Big Data
  • Build some graphics in pptx and import them as images
  • Web scrapping for additional data sets?
  • Graph with DATE as variable
  • Make German study in German
  • Replicate with other data sets
  • Check for plagiarism
  • Make video explaining thesis for prof. grading

Helpful Notes

  1. Define the central concepts used early on
  2. Start each chapter with a small introduction and end it with a brief summary of results
  3. Provide an outlook of the future developments of the particular scientific discussion, discuss policy implications and point out open questions.

Playground




End of Document

Anguita, Davide, Alessandro Ghio, Noemi Greco, Luca Oneto, and Sandro Ridella. 2010. “Model Selection for Support Vector Machines: Advantages and Disadvantages of the Machine Learning Theory.” In The 2010 International Joint Conference on Neural Networks (IJCNN), 1–8. IEEE. https://doi.org/10.1109/IJCNN.2010.5596450.
Anissanti, Meita. 2021. “The Link Between GDP Growth and the Real Estate Market.” Asia Green Real Estate, November. https://www.asiagreen.com/en/news-insights/the-link-between-gdp-growth-and-the-real-estate-market.
Arnold, Mark J., and Kristy E. Reynolds. 2003. “Hedonic Shopping Motivations.” Journal of Retailing 79 (January): 77–95. https://doi.org/10.1016/S0022-4359(03)00007-1.
BAO, Helen X. H., and Cynthia M. GONG. 2016. “ENDOWMENT EFFECT AND HOUSING DECISIONS.” International Journal of Strategic Property Management 20 (December): 341–53. https://doi.org/10.3846/1648715X.2016.1192069.
Bernasconi, Michele, Luca Corazzini, and Raffaello Seri. 2014. “Reference Dependent Preferences, Hedonic Adaptation and Tax Evasion: Does the Tax Burden Matter?” Journal of Economic Psychology 40 (February): 103–18. https://doi.org/10.1016/j.joep.2013.01.005.
Berry, Brian J. L., and Robert S. Bednarz. 1975. “A Hedonic Model of Prices and Assessments for Single-Family Homes: Does the Assessor Follow the Market or the Market Follow the Assessor?” Land Economics 51 (February): 21. https://doi.org/10.2307/3145138.
Bingyang, L V, Mao Jie, and L V Yinhan. 2013. “Incentive Mechanism for Governments in the Market of Real Estate: Problems and Reforms.” Finance &Amp; Trade Economics, 7.
Breusch, T. S., and A. R. Pagan. 1979. “A Simple Test for Heteroscedasticity and Random Coefficient Variation.” Econometrica 47 (September): 1287. https://doi.org/10.2307/1911963.
Bruin, J. 2011. “Newtest: Command to Compute New Test @ONLINE.” http://www.ats.ucla.edu/stat/stata/ado/analysis/.
Clapp, John M., and Carmelo Giaccotto. 1998. “Residential Hedonic Models: A Rational Expectations Approach to Age Effects.” Journal of Urban Economics 44 (November): 415–37. https://doi.org/10.1006/juec.1997.2076.
Collett, David, Colin Lizieri, and Charles Ward. 2003. “Timing and the Holding Periods of Institutional Real Estate.” Real Estate Economics 31 (June): 205–22. https://doi.org/10.1111/1540-6229.00063.
Cowling, Keith, and John Cubbin. 1972. “Hedonic Price Indexes for United Kingdom Cars.” The Economic Journal 82 (September): 963. https://doi.org/10.2307/2230261.
Curcuru, Stephanie, John Heaton, Deborah Lucas, and Damien Moore. 2010. “Heterogeneity and Portfolio Choice: Theory and Evidence.” Handbook of Financial Econometrics: Tools and Techniques, 337–82. https://doi.org/10.1016/B978-0-444-50897-3.50009-2.
Du, Hongyan, Yongkai Ma, and Yunbi An. 2011. “The Impact of Land Policy on the Relation Between Housing and Land Prices: Evidence from China.” The Quarterly Review of Economics and Finance 51 (February): 19–27. https://doi.org/10.1016/j.qref.2010.09.004.
Dulberger, Ellen R. 1987. “THE APPLICATION OF AN HEDONIC MODEL TO a QUALITY ADJUSTED PRICE INDEX FOR COMPUTER PROCESSORS.”
Dutta, Sourav. 2018. “An Overview on the Evolution and Adoption of Deep Learning Applications Used in the Industry.” WIREs Data Mining and Knowledge Discovery 8 (July). https://doi.org/10.1002/widm.1257.
Epple, Dennis. 1987. “Hedonic Prices and Implicit Markets: Estimating Demand and Supply Functions for Differentiated Products.” Journal of Political Economy 95 (February): 59–80. https://doi.org/10.1086/261441.
FRED. 2021. “Gross Domestic Product.” Federal Reserve Bank of the USA. https://fred.stlouisfed.org/series/GDP.
Gardiner, Brian. 1997. “Squatters’ Rights and Adverse Possession: A Search for Equitable Application of Property Laws.” Ind. Int’l &Amp; Comp. L. Rev. 8: 119.
Goodman, A. C. 1978. “Hedonic Prices, Price Indices and Housing Markets.” Journal of Urban Economics, 471–84.
Gouriéroux, Christian, and Anne Laferrère. 2009. “Managing Hedonic Housing Price Indexes: The French Experience.” Journal of Housing Economics 18 (September): 206–13. https://doi.org/10.1016/j.jhe.2009.07.012.
Guilkey, David, Mike Miles, and Rebel Cole. 1989. “The Motivation for Institutional Real Estate Sales and Implications for Asset Class Returns.” Real Estate Economics 17 (March): 70–86. https://doi.org/10.1111/1540-6229.00474.
Herath, Shanaka, and Gunther Maier. 2010. “The Hedonic Price Method in Real Estate and Housing Market Research: A Review of the Literature.”
Holbrook, Morris B., and Elizabeth C. Hirschman. 1982. “The Experiential Aspects of Consumption: Consumer Fantasies, Feelings, and Fun.” Journal of Consumer Research 9 (September): 132. https://doi.org/10.1086/208906.
Hoy, Michael, and Emmanuel Jimenez. 1991. “Squatters’ Rights and Urban Development: An Economic Perspective.” Economica 58 (February): 79. https://doi.org/10.2307/2554976.
Kahneman, Daniel, Jack L Knetsch, and Richard H Thaler. 1990. “Experimental Tests of the Endowment Effect and the Coase Theorem.” Journal of Political Economy 98: 1325–48.
LaDH. 2022. “Louisiana Department of Health: Covid-19 Information @ONLINE.” https://ldh.la.gov/Coronavirus/.
LeSage, James P., and R. Kelley Pace. 2004. “Models for Spatially Dependent Missing Data.” The Journal of Real Estate Finance and Economics 29 (September): 233–54. https://doi.org/10.1023/B:REAL.0000035312.82241.e4.
LING, DAVID C., JOSEPH T. L. OOI, and THAO T. T. LE. 2015. “Explaining House Price Dynamics: Isolating the Role of Nonfundamentals.” Journal of Money, Credit and Banking 47 (March): 87–125. https://doi.org/10.1111/jmcb.12194.
Locke, John, and Wolfram Engels. 1691. Some Considerations of the Consequences of the Lowering of Interest, and Raising the Value of Money. Verlag Wirtschaft und Finanzen.
Manhertz, Treh. 2021. “The u.s. Housing Market Gained More Value in 2020 Than in Any Year Since 2005.” Zillow Research. https://www.zillow.com/research/zillow-total-housing-value-2020-28704/.
Matas, Anna, and Josep-Lluis Raymond. 2009. “Hedonic Prices for Cars: An Application to the Spanish Car Market, 1981–2005.” Applied Economics 41 (October): 2887–2904. https://doi.org/10.1080/00036840701720945.
McKibbin, Warwick J., and Roshen Fernando. 2020. “Global Macroeconomic Scenarios of the COVID-19 Pandemic.” SSRN Electronic Journal. https://doi.org/10.2139/ssrn.3635103.
Mohd, Thuraiya, Nur Syafiqah Jamil, Noraini Johari, Lizawati Abdullah, and Suraya Masrom. 2020. “An Overview of Real Estate Modelling Techniques for House Price Prediction.” Charting a Sustainable Future of ASEAN in Business and Social Sciences, 321–38. https://doi.org/10.1007/978-981-15-3859-9_28.
Moulton, Brent R. 1996. “Bias in the Consumer Price Index: What Is the Evidence?” Journal of Economic Perspectives 10 (November): 159–77. https://doi.org/10.1257/jep.10.4.159.
Nanda, Anupam, Sotirios Thanos, Eero Valtonen, Yishuang Xu, and Razieh Zandieh. 2021. “Forced Homeward: The COVID-19 Implications for Housing.” Town Planning Review 92 (January): 25–31. https://doi.org/10.3828/tpr.2020.79.
Nicolaides, Phedon. 1988. “Limits to the Expansion of Neoclassical Economics.” Cambridge Journal of Economics 12: 313–28.
Pace, R. Kelley, and Otis W. Gilley. 1998. “Generalizing the OLS and Grid Estimators.” Real Estate Economics 26 (June): 331–47. https://doi.org/10.1111/1540-6229.00748.
Pagourtzi, Elli, Vassilis Assimakopoulos, Thomas Hatzichristos, and Nick French. 2003. “Real Estate Appraisal: A Review of Valuation Methods.” Journal of Property Investment & Finance 21 (August): 383–401. https://doi.org/10.1108/14635780310483656.
Schultze, Charles L. 2003. “The Consumer Price Index: Conceptual Issues and Practical Suggestions.” Journal of Economic Perspectives 17 (February): 3–22. https://doi.org/10.1257/089533003321164921.
Shimizu, Chihiro, Hideoki Takatsuji, Hiroya Ono, and Kiyohiko G. Nishimura. 2010. “Structural and Temporal Changes in the Housing Market and Hedonic Housing Price Indices.” International Journal of Housing Markets and Analysis 3 (October): 351–68. https://doi.org/10.1108/17538271011080655.
Sirmans, G. Stacy, Lynn MacDonald, David A. Macpherson, and Emily Norman Zietz. 2006. “The Value of Housing Characteristics: A Meta Analysis.” The Journal of Real Estate Finance and Economics 33 (November): 215–40. https://doi.org/10.1007/s11146-006-9983-5.
Tajani, Francesco, Felicia Di Liddo, Maria Rosaria Guarini, Rossana Ranieri, and Debora Anelli. 2021. “An Assessment Methodology for the Evaluation of the Impacts of the COVID-19 Pandemic on the Italian Housing Market Demand.” Buildings 11 (November): 592. https://doi.org/10.3390/buildings11120592.
Turing, Alan Mathison. 1950. “Mind.” Mind 59: 433–60.
Wakefield, Robin L, and Dwayne Whitten. 2006. “Mobile Computing: A User Study on Hedonic/Utilitarian Mobile Device Usage.” European Journal of Information Systems 15 (June): 292–300. https://doi.org/10.1057/palgrave.ejis.3000619.
Wallace, Nancy E, and Richard A Meese. 1997. “The Construction of Residential Housing Price Indices: A Comparison of Repeat-Sales, Hedonic-Regression, and Hybrid Approaches.” The Journal of Real Estate Finance and Economics 14: 51–73.
Wheaton, William C. 1999. “Real Estate "Cycles": Some Fundamentals.” Real Estate Economics 27 (June): 209–30. https://doi.org/10.1111/1540-6229.00772.
White, Halbert. 1980. “A Heteroskedasticity-Consistent Covariance Matrix Estimator and a Direct Test for Heteroskedasticity.” Econometrica 48 (May): 817. https://doi.org/10.2307/1912934.
WHO. 2021. “Covid19.who.int.” World Health Emergency Dashboard WHO. https://covid19.who.int/table.
LS0tCnRpdGxlOiBBbiBFbXBlcmljYWwgRWNvbm9taWMgSW52ZXN0aWdhdGlvbiBpbnRvIENPVklELTE5J3MgSW1wYWN0IG9uIEZ1bmRlbWVudGFsIEhlZG9uaWMKICBGZWF0dXJlcyBpbiBSZWFsIEVzdGF0ZSBWYWx1YXRpb24gTW9kZWxzCmF1dGhvcjogIlNhd3llciBNLiBCZW5zb24iCmRhdGU6ICJEZWNlbWJlciAyMSwgMjAyMSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIHBkZl9kb2N1bWVudDogZGVmYXVsdApiaWJsaW9ncmFwaHk6IGxpYnJhcnkuYmliCmxpbmstY2l0YXRpb25zOiB5ZXMKLS0tCgoKPGJyPjxicj4KCiMjIyBDaGVjayBMaXN0CiogQ2hlY2sgc2VjdGlvbiBudW1iZXJpbmcKKiBTcGVsbCBjaGVjawoKPGJyPjxicj4KCiMjIyBDb3ZlciBQYWdlCgpVbmRlciBjb25zdHJ1Y3Rpb24KCjxicj4KCiMjIyBBYnN0cmFjdAoKVW5kZXIgY29uc3RydWN0aW9uCgo8YnI+CgojIyMgICAgIFRhYmxlIG9mIENvbnRlbnRzCgoxLiAqKkludHJvZHVjdGlvbioqCjIuICoqTGl0ZXJhdHVyZSBSZXZpZXcqKgozLiAqKkRhdGEqKgo0LiAqKk1ldGhvZG9sb2d5KioKNS4gKipSZXN1bHRzKioKNi4gKipEaXNjdXNzaW9uKioKNy4gKipDb25jbHVzaW9uKioKOC4gKipCaWJsaW9ncmFwaHkqKgo5LiAqKkFwcGVuZGl4KioKCjxicj4KCiMjIyBGaWd1cmVzLCBUYWJsZXMsIGFuZCBBYmJyZXZpYXRpb25zClVuZGVyIGNvbnN0cnVjdGlvbgoKPGJyPjxicj4KCiMjIyAxLiBJbnRyb2R1Y3Rpb24KCkluIGxhdGUgMjAxOSwgYSB2aXJ1cyBmaXJzdCBkZXRlY3RlZCBpbiBXdWhhbiwgQ2hpbmEgd291bGQgc2V0IGluIG1vdGlvbiBhIGdsb2JhbCBwYW5kZW1pYyB3aGljaCwgYnkgdGhlIGVuZCBvZiAyMDIxLCB3aWxsIGhhdmUKa2lsbGVkIDQuMyBtaWxsaW9uIHBlb3BsZSwgaW5mZWN0aW5nIDIzOCBtaWxsaW9uIG90aGVycywgYW5kIGRpc3J1cHRpbmcgdGhlIGdsb2JhbCBlY29ub215IGFjcm9zcyB2aXJ0dWFsbHkgZXZlcnkgbWVhc3VyYWJsZQpkaW1lbnNpb24gW0BXSE9EZWF0aF0uIEFjY29yZGluZyB0byBzZXZlbiBlY29ub21pYyBpbXBhY3QgbW9kZWxzIGNvbnN0cnVjdGVkIGJ5IEBNY0tpYmJpbiwgZXN0aW1hdGVzIG9mIHRoZSB0b3RhbCBnbG9iYWwgZWNvbm9taWMKbG9zcyBpbiB0ZXJtcyBvZiBHRFAgYXJlIG1lYXN1cmVkIHRvIGJlIGFzIGxhcmdlIGFzIDkuMiB0cmlsbGlvbiBVLlMuIGRvbGxhcnMuIEhvd2V2ZXIsIGRlc3BpdGUgYSBnZW5lcmFsbHkgcG9zaXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBHRFAgYW5kIHJlYWwgZXN0YXRlIHByaWNlcyAqKHNlZSBpbWFnZSAxKSosIGhpc3RvcmljYWxseSBtZWFzdXJlZCBhcyBoaWdoIGFzIDk4JSwgcmVhbCBlc3RhdGUgbWFya2V0IHByaWNlcyBpbiB0aGUgVS5TLiBoaXQgbmVhci1yZWNvcmQgaGVpZ2h0cyBmb2xsb3dpbmcgdGhlIG91dGJyZWFrIG9mIENPVklELTE5IFtAQXNpYUdyZWVuXS4gQWNjb3JkaW5nIHRvIGEgcmVwb3J0IHJlbGVhc2VkIGJ5IFppbGxvdwpBbmFseXRpY3MgW0BNYW5oZXJ0el0sIFUuUy4gcmVhbCBlc3RhdGUgZ2FpbmVkIDIuNSB0cmlsbGlvbiBkb2xsYXJzIG9mIHZhbHVlIGluIDIwMjAgYWxvbmUsIHJlcHJlc2VudGluZyB0aGUgbGFyZ2VzdCBzaW5nbGUteWVhcgpncm93dGggc2luY2UgMjAwNSwgZGVzcGl0ZSBhbiBhcHByb3hpbWF0ZWx5IDc2MCBiaWxsaW9uIGRvbGxhciBkZWNyZWFzZSBpbiBHRFAgaW4gdGhlIHNhbWUgeWVhciBbQEZSRUQyMDIxXS4gVGhlIGZvY3VzIG9mIHRoaXMKdGhlc2lzIGlzIHRvIGludmVzdGlnYXRlIHRoZSByZWFzb25zIGJlaGluZCB3aHkgYW5kIGhvdyByZWFsIGVzdGF0ZSBtYXJrZXQgcHJpY2VzIGhhdmUgYnJva2VuIHRyZW5kIGFuZCBiZWhhdmVkIHNvCnVuY2hhcmFjdGVyaXN0aWNhbGx5IGNvdW50ZXIgY3ljbGljYWwgaW4gdGhlIGZhY2Ugb2YgYSBnbG9iYWwgcGFuZGVtaWMuCgo8YnI+CjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L0dEUF9Ib3VzaW5nX05vbWluYWwucG5nKXt3aWR0aD03MCV9CjwvY2VudGVyPgo8YnI+CgpJbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLCBJIHdpbGwgYXBwbHkgdGhlIEhlZG9uaWMgUHJpY2luZyBNZXRob2QgKEhQTSkgdG8gTG91aXNpYW5hIGhvdXNpbmcgbWFya2V0IGRhdGEgaW4gb3JkZXIgdG8gaW5mZXJlbnRpYWxseSBkZXNjcmliZSB0aGUgZWNvbm9taWMgaW1wYWN0IG9mIHRoZSBnbG9iYWwgcGFuZGVtaWMgb24gcmVzaWRlbnRpYWwgaG91c2luZyBtYXJrZXQgdmFsdWVzLiBGdXJ0aGVybW9yZSwgSSB3aWxsIHRha2UgYWR2YW50YWdlIG9mIHRoZSBIUE0ncyBzdHJ1Y3R1cmFsIGZyYW1ld29yayBvZiB1c2luZyByZWFsIGVzdGF0ZSBwcm9wZXJ0aWVzJyBoZWRvbmljIGZlYXR1cmVzIChlLmcuLCBzaXplLCBhZ2UsIG51bWJlciBvZiBiZWRyb29tcywgZXRjLikgdG8gdGVzdCBmb3IgY2hhbmdlcyBpbiBkZW1hbmQgZm9yIHNwZWNpZmljIHByb3BlcnR5IGZlYXR1cmVzIHByZSB2cyBwb3N0IHBhbmRlbWljLiBUaGUgSFBNIHdpbGwgYmUgZWNvbm9tZXRyaWNhbGx5IG1vZGVsZWQgdXNpbmcgYW4gT3JkaW5hcnkgTGVhc3QgU3F1YXJlcyAoT0xTKSByZWdyZXNzaW9ucyBmcmFtZXdvcmsgZm9yIHNwZWNpZmljIHZhcmlhYmxlIGFuYWx5c2lzIHdoaWxlIHNldmVyYWwgdmFyaWF0aW9ucyBvZiBtYWNoaW5lIGxlYXJuaW5nIChNTCkgcHJlZGljdGlvbiBtb2RlbHMgd2lsbCBiZSBlc3RpbWF0ZWQgdG8gdGVzdCBkaWZmZXJlbnQgaW5kZXBlbmRlbnQgdmFyaWFibGVzJyBtYXhpbXVtIGV4cGxhbmF0b3J5IHBvd2VyIGluIHByZWRpY3Rpbmcgb3V0LW9mLXNhbXBsZSBvYnNlcnZhdGlvbnMuIFRoZSByZXN1bHRzIG9mIHRoZXNlIG1vZGVscyB3aWxsIHNoZWQgbGlnaHQgaW50byB0aGUgb3RoZXJ3aXNlIGNvdW50ZXIgaW50dWl0aXZlIHJlc3BvbnNlIG9mIHJlYWwgZXN0YXRlIHByaWNpbmcgZHluYW1pY3MgdG8gdGhlIENPVklELTE5IGdsb2JhbCBwYW5kZW1pYy4gICAgCgo8YnI+PGJyPgoKIyMjIDIuIExpdGVyYXR1cmUgUmV2aWV3CgojIyMjIDIuMSBCYWNrZ3JvdW5kCgpUaGUgbWFya2V0IHZhbHVlIG9mIGEgY29tbW9kaXR5IGlzIG1vc3Qgb2Z0ZW4gdGhlb3JldGljYWxseSBkZWZpbmVkIGFzIHRoZSBlcXVpbGlicml1bSBwcmljZSBkZXJpdmVkIGZyb20gdGhlIGJhc2ljIGVjb25vbWljCnByaW5jaXBhbCwgb3IgbGF3LCBvZiBzdXBwbHkgYW5kIGRlbWFuZCBbQExvY2tlOyBARXBwbGVdLiBIb3dldmVyLCB0aGUgcmVhbCBlc3RhdGUgbWFya2V0IG9mdGVuIHZpb2xhdGVzIHRoaXMgYXNzdW1wdGlvbiBkdWUgdG8KaXRzIHVuaXF1ZSBjaGFyYWN0ZXJpc3RpY3MgYXMgYW4gYXNzZXQgY2xhc3MgW0BXaGVhdG9uXS4gRm9yIGV4YW1wbGUsIG11Y2ggb2YgdGhlIHVuZGVybHlpbmcgdXRpbGl0eSBvZiBhIHByb3BlcnR5IGlzIGl0cyB1c2UgYXMgYSBtZWFucyBvZiBzaGVsdGVyCmJ5IGl0cyBvd25lciBbQExpbmddLiBUaGlzIHJhdGhlciB1bnVzdWFsIHJlbGF0aW9uc2hpcCB0byB0aGlzIGFzc2V0IGludHJvZHVjZXMgc2V2ZXJhbCBiZWhhdmlvcmFsIGJpYXNlcyB3aGljaCBjYXVzZSBlY29ub21pYwpmcmljdGlvbnMgbm90IGFjY291bnRlZCBmb3IgYnkgdHJhZGl0aW9uYWwgbmVvY2xhc3NpY2FsIGVjb25vbWljIHRoZW9yeSBbQE5pY29sYWlkZXNdLiBBIG5vdGFibGUgZXhhbXBsZSBvZiBiZWhhdmlvcmFsIGJpYXMgaW1wYWN0aW5nIHJlYWwgZXN0YXRlIHByaWNlIGR5bmFtaWNzIGlzIHRoZSBlbmRvd21lbnQgZWZmZWN0LiBUaGlzIGJlaGF2aW9yYWwgZmluZGluZyB3YXMgb3JpZ2luYWxseSBlc3RhYmxpc2hlZCBieQpAS2FobmVtYW4gaW4gdGhlIGxhdGUgMjB0aCBjZW50dXJ5LCBhbmQgbGF0ZXIgYXBwbGllZCB0byByZWFsIGVzdGF0ZSBtYXJrZXRzIGJ5IEBCQU8uIFRoZSBsYXR0ZXIgb2YgdGhlIHR3byBzdGF0aW5nIHRoYXQgdGhlIHByZWRpY3RhYmx5CmlycmF0aW9uYWwgYmVoYXZpb3Igb2YgbWFya2V0IHBhcnRpY2lwYW50cyB0byBvdmVydmFsdWUgdGhlaXIgaG9tZSBkdWUgdG8gc2VudGltZW50YWwgYXR0YWNobWVudCB0byB0aGUgcHJvcGVydHkgZm9yY2VzIG1hcmtldCBwcmljZXMgaW50byBzdXN0YWluZWQgZWNvbm9taWMgZGlzZXF1aWxpYnJpdW0uIE90aGVyIGhpZ2hseSBjaXRlZCBhbmQgdW51c3VhbCBjaGFyYWN0ZXJpc3RpY3MgYXJlIHRoYXQgcmVhbAplc3RhdGUgYXNzZXRzIGFyZSB2ZXJ5IGluZnJlcXVlbnRseSB0cmFkZWQgZHVlIHRvIGhpZ2ggdHJhbnNhY3Rpb24gY29zdHMgW0BDb2xsZXR0OyBAR3VpbGtleV0sIGdvdmVybm1lbnRzIHRlbmQgdG8gaW50ZXJmZXJlLCBib3RoCmRpcmVjdGx5IGFuZCBpbmRpcmVjdGx5IHdpdGggcmVhbCBlc3RhdGUgbWFya2V0cyB0aHJvdWdoIHRoZSBjcmVhdGlvbiBvZiBmaXNjYWwgYW5kIG1vbmV0YXJ5IHBvbGljaWVzIFtAQmluZ3lhbmc7IEBEdV0sIGFuZCB0aHJvdWdoCmNyZWF0aW5nIHJlbnRlci1wcm90ZWN0aW9ucyBsYXdzIHN1Y2ggYXMgJ3NxdWF0dGVyJ3MgcmlnaHRzJyBsYXdzIHdoaWNoIGFsbG93IGEgcmVudGVyIHRvIHJlbWFpbiBpbiBhIGhvbWUgZm9yIGV4dGVuZGVkCnBlcmlvZHMgb2YgdGltZSBsb25nIGFmdGVyIHRoZXkgaGF2ZSBzdG9wcGVkIHBheWluZyByZW50IFtASG95OyBAR2FyZGluZXJdLgoKIyMjIyAyLjIgUmVhbCBFc3RhdGUgVmFsdWF0aW9uIE1ldGhvZHMKClRoZSBpZGlvc3luY3JhdGljIGFzc2V0IGZlYXR1cmVzIG91dGxpbmVkIGluIHNlY3Rpb24gMi4xIGFsb25nIHdpdGggYSBoaWdoIGxldmVsIG9mIGhldGVyb2dlbmVpdHkgYWNyb3NzIG1hbnkgZGltZW5zaW9ucyBvZiB0aGUgZW50aXJlIHJlYWwgZXN0YXRlIGFzc2V0IGNsYXNzIG1ha2VzIHRoZSBjcmVhdGlvbiBvZiBhIGdlbmVyYWxpemVkIHByaWNpbmcgbW9kZWwgZGlmZmljdWx0IGFuZCBoYXZlIGxlZCB0byBhIHdpZGUgcmFuZ2Ugb2YgcHJvcG9zYWxzIGFuZCByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hhdCBkZXRlcm1pbmVzIHRoZSBtYXJrZXQgcHJpY2Ugb2YgcmVhbCBlc3RhdGUgYXNzZXRzIGFuZCBob3cgdG8gcmVsaWFibHkgbW9kZWwgdGhvc2UgcHJpY2luZyBkeW5hbWljcyBbQEN1cmN1cnVdLiBJbiBAUGFnb3VydHppLCB0aGUgYXV0aG9ycyBvdXRsaW5lcyBzZXZlcmFsIG9mIHRoZSBjdXJyZW50bHkgYWNjZXB0ZWQgcmVhbCBlc3RhdGUgdmFsdWF0aW9uIG1ldGhvZHMsIHJhbmdpbmcgZnJvbSB3aGF0IHRoZXkgY2F0ZWdvcml6ZSBhcyB0aGUgKnRyYWRpdGlvbmFsIG1ldGhvZHMqLCBzdWNoIGFzIGNvbXBhcmFibGUtZ3JvdXAsIGNvc3QsIGluY29tZS1tdWx0aXBsZSwgcHJvZml0LW11bHRpcGxlLCBhbmQgY29udHJhY3RvcuKAmXMgbWV0aG9kLCB0byB0aGUgKmFkdmFuY2VkIG1ldGhvZHMqLCBzdWNoIGFzIEFOTnMsIHNwYXRpYWwgYW5hbHlzaXMgbWV0aG9kcywgZnV6enkgbG9naWMsIGFuZCB0aGUgaGVkb25pYyBwcmljaW5nIG1ldGhvZC4gQWNjb3JkaW5nIHRvIGEgbWV0YSBhbmFseXNpcyBjb25kdWN0ZWQgYnkgQFNpcm1hbnMsIGN1cnJlbnRseSwgdGhlIG1vc3Qgd2lkZWx5IHVzZWQgYW5kIGFjY2VwdGVkIGFkdmFuY2VkIG1ldGhvZG9sb2dpY2FsIGZyYW1ld29yayBmb3IgcmVhbCBlc3RhdGUgdmFsdWF0aW9uIG1vZGVsaW5nIGlzIHRoZSBIZWRvbmljIFByaWNpbmcgTWV0aG9kLgoKCiMjIyMjIDIuMi4xIEhlZG9uaWMgUHJjaW5nIE1vZGVsIGluIFJlYWwgRXN0YXRlCgpGaXJzdCBhcHBsaWVkIGluIDE5Mzkgb24gYXV0b21vYmlsZSBkYXRhLCBhY2NvcmRpbmcgdG8gQEdvb2RtYW4sIHRoZSBIUE0gaXMgYSBtb2RlbCB3aGljaCBlc3RpbWF0ZXMgdGhlIHZhbHVlIG9mIGRpc3RpbmN0IGNoYXJhY3RlcmlzdGljcyBvZiBhIGNvbW1vZGl0eSB3aGljaCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGNvbnRyaWJ1dGUgdG8gaXRzIG1hcmtldCB2YWx1ZS4gQmVzaWRlcyBpdHMgaW1wbGVtZW50YXRpb24gaW4gcmVhbCBlc3RhdGUgZmluYW5jZSBhbmQgZWNvbm9taWNzLCBzdWNoIGFzIGluIHRoaXMgdGhlc2lzLCB0aGlzIG1ldGhvZG9sb2d5IGhhcyBhIHdpZGUgcmFuZ2Ugb2YgYXBwbGljYXRpb25zIHN1Y2ggYXMgaXRzIGltcGxlbWVudGF0aW9uIGluIGNvbnN1bWVyIGFuZCBtYXJrZXQgcmVzZWFyY2ggW0BIb2xicm9vazsgQEFybm9sZF0sIGNvbnN0cnVjdGlvbiBvZiBjb25zdW1lciBwcmljZSBpbmRpY2VzIFtATW91bHRvbjsgQFNjaHVsdHplXSwgdmFyaW91cyB0YXggYXNzZXNzbWVudHMgW0BCZXJyeTsgQEJlcm5hc2NvbmldLCBhdXRvbWF0ZWQgYXV0b21vYmlsZSB2YWx1YXRpb24gW0BDcm93bGluZzsgQE1hdGFzXSwgYW5kIGNvbXB1dGVyIHNhbGVzIFtARHVsYmVyZ2VyOyBAV2FrZWZpZWxkXS4KClNpbmNlIGl0cyBpbnRyb2R1Y3Rpb24sIHRoZSBIUE0gaGFzIGdhaW4gc2lnbmlmaWNhbnQgcG9wdWxhcml0eSBhbW9uZyBob3VzaW5nIG1hcmtldCBhbmQgY29tbWVyY2lhbCByZWFsCmVzdGF0ZSByZXNlYXJjaGVycy4gVGhlIHNwZWNpZmljIHJlYWwgZXN0YXRlLWJhc2VkIHRvcGljcyBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCB0aGUgY29uc3RydWN0aW9uIG9mIGhvdXNpbmcgcHJpY2UgaW5kaWNlcyBbQEdvdXJpZXJvdXg7IEBXYWxsYWNlXSwgdGhlIGVzdGltYXRpb24gYW5kIHByZWRpY3Rpb24gb2YgYSBwcm9wZXJ0eSdzIG1hcmtldCB2YWx1ZSBpbiBzaXR1YXRpb25zIHdoZXJlIG1hcmtldC10cmFuc2FjdGlvbiBkYXRhIGlzIGxvdy1kaW1lbnNpb25hbCBvciBub24tZXhpc3RlbnQKW0BMZVNhZ2VdLCBhbmQsIGFzIGluIHRoaXMgdGhlc2lzLCB0aGUgc3BlY2lmaWMgYW5hbHlzaXMgb2YgY2hhbmdlcyBpbiB0aGUgZGVtYW5kIGZvciBzcGVjaWZpYyBwcm9wZXJ0eSBjaGFyYWN0ZXJpc3RpY3MgYWNyb3NzIHRpbWUsIHN1Ymdyb3Vwcywgb3IKYm90aCBbQENsYXBwXS4gQXMgdGhlIGJyb2FkIHNlYXJjaCBmb3IgYSBzYXRpc2ZhY3RvcnkgbW9kZWxpbmcgZnJhbWV3b3JrIGZvY3VzZXMgaW4gb24gdGhlIEhQTSwgYW5vdGhlciBkZWJhdGUgYXJpc2VzIHJlZ2FyZGluZyB0aGUgYmVzdCBmdW5jdGlvbmFsIGZvcm0gb2YgdGhpcyBtZXRob2QuIFRyYWRpdGlvbmFsbHkgdXRpbGl6aW5nIHRoZSBzdGFuZGFyZCBPTFMgZnJhbWV3b3JrIFtAUGFjZV0sIHJlc2VhcmNoZXJzIGFyZSBpbmNyZWFzaW5nbHkgdXRpbGl6aW5nIGEgdmFyaWV0eSBtYWNoaW5lIGxlYXJuaW5nIGFsZ29yaXRobXMgdG8gYWNjb21wbGlzaCBhbiBpbmNyZWFzaW5nbHkgbW9yZSByZWZpbmVkIHNldCBvZiBmaW5kaW5ncy4KCiMjIyMjIDIuMi4yIE9MUyBhbmQgdGhlIEhlZG9uaWMgUHJpY2luZyBNb2RlbCBpbiBSZWFsIEVzdGF0ZQpVbnN1cnByaXNpbmdseSwgcmVncmVzc2lvbiBhbmFseXNpcyBpcyB0aGUgcHJlZmVycmVkIGVzdGltYXRpb24gYXBwcm9hY2ggYW1vbmcgcmVhbCBlc3RhdGUgcmVzZWFyY2hlcnMgd2hlbiB1c2luZyBIUFQgZm9yIHByaWNlIGVzdGltYXRpb24uIFRoZXNlIG11bHRpcGxlIHJlZ3Jlc3Npb24gYW5hbHlzaXMgbWV0aG9kcyBhcmUgbW9zdCBvZnRlbiBlaXRoZXIgYW4gT3JkaW5hcnkgTGVhc3QgU3F1YXJlcyAoT0xTKSByZWdyZXNzaW9uIG9yIGEgTWF4aW11bSBMaWtlbGlob29kIGFwcHJveGltYXRpb24gb2YgdGhlIGxvZy1saWtlbHkgZXF1YXRpb24gZGVyaXZlZCBkaXJlY3RseSBmcm9tIHRoZSBoZWRvbmljIGZ1bmN0aW9uLiBFYWNoIG9mIHRoZXNlIGVzdGltYXRpb24gbWV0aG9kcyB0YWtlIGEgZnVuY3Rpb25hbGx5IHNpbWlsYXIgcGF0aCBhcyB0aGV5IGJvdGggZXN0aW1hdGUgYSB2ZWN0b3Igb2YgcGFyYW1ldGVycyAoaS5lLiBiZXRhIGNvZWZmaWNpZW50cykgdGhhdCBiZXN0IGZpdHMgdGhlIGV4cGxhbmF0b3J5IGhlZG9uaWMgdmFyaWFibGVzIHRvIHRoZSBhc3NvY2lhdGVkIG1hcmtldCBwcmljZS4gVGhleSBkaWZmZXIgb25seSBieSB0aGUgbG9zcyBmdW5jdGlvbiB1c2VkIGluIHRoZSBpZGVudGlmaWNhdGlvbiBvZiB0aGF0IGJlc3QtZml0dGVkIHBhcmFtZXRlciB2ZWN0b3IuCgpUaGUgbW9zdCBjb21tb25seSB1c2VkIGhlZG9uaWMgcHJpY2UgcmVncmVzc2lvbiBlcXVhdGlvbiB3aXRoIHJlc3BlY3QgdG8gcmVhbCBlc3RhdGUgbWFya2V0cyBtb2RlbHMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG1hcmtldCByZW50cyBvciBtYXJrZXQgcHJvcGVydHkgdmFsdWVzIHRvIGEgbGlzdCBvZiBoZWRvbmljIGNoYXJhY3RlcmlzdGljcy4gVGhlIGNsYXNzaWNhbCBjb25zdHJ1Y3Rpb24gb2YgdGhpcyBtb2RlbCBhY2NvcmRpbmcgdG8gKiooSGVyYXRoLCBTLiBLLiAmIE1haWVyLCBHLiAoMjAxMCkpKiogaXMgdGhlIGZvbGxvd2luZzoKCiQkClIgPSBmKFAsTixMLHQpCiQkCndoZXJlICRSJCBpcyByZW50IG9yIHByaWNlIG9mIHRoZSBwcm9wZXJ0eTsgJFAkIGlzIHByb3BlcnR5IHJlbGF0ZWQgYXR0cmlidXRlczsgJE4kIGlzIG5laWdoYm9yaG9vZCBjaGFyYWN0ZXJpc3RpY3M7ICRMJCBpcyBsb2NhdGlvbmFsIHZhcmlhYmxlcyBhbmQ7ICR0JCBpcyBhbiBpbmRpY2F0b3Igb2YgdGltZS4KCiMjIyMjIDIuMi4zIE1hY2hpbmUgTGVhcm5pbmcgYW5kIHRoZSBIZWRvbmljIFByaWNpbmcgTW9kZWwgaW4gUmVhbCBFc3RhdGUKClRob3VnaCBmaXJzdCBpbnRyb2R1Y2VkIGJ5IEBUdXJpbmcgdW5kZXIgdGhlIGJyb2FkZXIgdW1icmVsbGEgdGVybSBvZiAqYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2UqLCB0aGUgYWRvcHRpb24gb2YgTUwgbWV0aG9kcyBpbiByZWFsIGVzdGF0ZSB3b3VsZCB0YWtlIG1hbnkgeWVhcnMgb2Ygc29mdHdhcmUgYW5kIGhhcmR3YXJlIGRldmVsb3BtZW50LCBhbGxvd2luZyBvciB0aGUgc3Vic2VxdWVudCBjb2xsZWN0aW9uIG9mIGV2ZXItbGFyZ2VyIGRhdGEgc2V0cyBhbmQgY2VudHJhbCBwcm9jZXNzaW5nIHVuaXRlcyAoQ1BVcykgY2FwYWJsZSBvZiBwcm9jZXNzaW5nIHRoZSBvZnRlbiBleHRyYW9yZGluYXJ5IG51bWJlciBvZiBjYWxjdWxhdGlvbiByZXF1aXJlZCB0byBwcm9kdWNlIGEgc29sdXRpb24gZm9yIGEgZ2l2ZW4gYWxnb3JpdGhtIFtARHV0dGFdLiBUaGUgcHJpbWFyeSBhZHZhbnRhZ2Ugb2YgTUwgdGVjaG5pcXVlcyBhcmUgdGhhdCBNTCBhbGdvcml0aG1zIGxlYXJuIGFuZCBpbXByb3ZlIG92ZXIgdGltZSBhbmQgYWNyb3NzIG1hbnkgaXRlcmF0aW9ucyBhbmQgdmFyaWFibGUgY29tYmluYXRpb25zLCB3aGlsZSB0cmFkaXRpb24gc3RhdGlzdGljYWwgYW5kIGVjb25vbWV0cmljIHRlY2huaXF1ZXMgcHJvZHVjZSBzdGF0aWMgcmVzdWx0cyBhY3Jvc3MgYSBzaW5nbGUgbW9kZWwgW0BBbmd1aXRhXS4gIAogCkBNb2hkIHByb3ZpZGVzIGEgdGhvcm91Z2ggb3ZlcnZpZXcgb2YgdGhlIHZhcmlvdXMgYXBwbGljYXRpb25zIG9mIE1MIHRvIHJlYWwgZXN0YXRlIHZhbHVhdGlvbiBtZXRob2RzLCBpbmNsdWRpbmcgdGhlIFJpZGdlIGFuZCBMYXNzbyByZWdyZXNzaW9uIHRlY2huaXF1ZXMgdXNlZCBpbiB0aGlzIHRoZXNpcy4KCioqV29yayBpbiBQcm9ncmVzczogQWRkIG1vcmUgdm9sdW1lIGhlcmUuIFBvc3NpYmxlIGFkZGl0aW9uIG9mIG1vZGVscz8qKgoKPGJyPgoKIyMjIyAyLjMgQ09WSUQtMTkgQ3Jpc2lzJyBJbXBhY3Qgb24gUmVhbCBFc3RhdGUgTWFya2V0cwoKSW4gdGhlIHdha2Ugb2YgdGhlIENPVklELTE5IGNyaXNpcywgdGhlcmUgd2VyZSBzZXZlcmFsIHBhcGVycyBhbmQgYXJ0aWNsZXMgcmVnYXJkaW5nIHRoZSBlY29ub21pYyBpbXBhY3Qgb2YgdGhlIGdsb2JhbCBwYW5kZW1pYyBvbiB0aGUgaG91c2luZyBtYXJrZXQgYmVpbmcgZXhwZWRpdGlvdXNseSBwdWJsaXNoZXMgaW4gdmlydHVhbGx5IGV2ZXJ5IG1ham9yIGpvdXJuYWwuIEluIHRoaXMgc2VjdGlvbiAoMi4zKSwgSSBoYXZlIHNlbGVjdGVkIHRoZSBtb3N0IHJlbGV2YW50IG9mIHRoZXNlIHB1YmxpY2F0aW9ucyB3aXRoIHJlc3BlY3QgdG8gdGhpcyB0aGVzaXMuCgpTdHJ1Y3R1cmFsIGFuZCB0ZW1wb3JhbCBjaGFuZ2VzIGluIHRoZSBob3VzaW5nIG1hcmtldCB1c2luZyBoZWRvbmljIG1ldGhvZHMgW0BTaGltaXp1XSwgCgpDaGFuZ2VzIGluIGhvdXNpbmcgbWFya2V0IGRlbWFuZCBmb3Igc3BlY2lmaWMgcHJvcGVydHkgdHlwZXMgYW5kIGZlYXR1cmVzIFtAVGFqYW5pXSwgIAoKUG90ZW50aWFsIGNoYW5nZXMgaW4gaG91c2luZyBwcmVmZXJlbmNlcyBkdWUgdG8gdGhlIENPVklELTE5IHBhbmRlbWljIGFuZCBoaWdobGlnaHQgdGhlIGNoYWxsZW5nZXMgZm9yIHBvbGljeSBtYWtpbmcgW0BOYW5kYV0KCgoKPGJyPgoKKipUb25pYSBOb3RlczoqKgoKKiBBZGQgbXVsdGlwbGUgc291cmNlcyBvbiBzb21lIGNpdGF0aW9ucwoqIEFkZCByZWFsIGVzdGF0ZSBtYXJrZXQgZHVyaW5nIHRoZSBjcmlzaXMKKiBCcmVhayBpbnRvIHN1YnNlY3Rpb25zIGZyb20gd2lkZXN0IHRvIG1vc3Qgc3BlY2lmaWMKICAgKyBNYWtlIGxhc3Qgc3Vic2VjdGlvbiBzcGVjaWZpYyB0byB0aGlzIHRoZXNpcywgcXVvdGluZyBzb3VyY2VzIGFuZCB0aGVpciBmaW5kaW5ncwoqIE1ldGEgYW5hbHlzaXMgaXMgZ29vZAoKCgo8YnI+PGJyPgoKIyMjIDMuIERhdGEgCgojIyMjIDMuMSBEYXRhIENvbGxlY3Rpb24KClRoZSB1dGlsaXphdGlvbiBvZiBCaWcgRGF0YSBjb2xsZWN0ZWQgdGhyb3VnaCBhIGRhdGEtbWluaW5nIHByb2Nlc3MgY2FsbGVkICp3ZWItc2NyYXBwaW5nKiBoYXMgaW5jcmVhc2luZ2x5IGJlY29tZSB0aGUgbWV0aG9kIG9mIGNob2ljZSBmb3IgcmVzZWFyY2hlcnMgYWNyb3NzIGRpc2NpcGxpbmVzLiBUaGUgdGVybSB3ZWItc2NyYXBwaW5nIHNpbXBseSByZWZlcnMgdG8gdGhlIHByb2Nlc3Mgb2YgY29sbGVjdGluZyBzdHJ1Y3R1cmVkIGRhdGEgZnJvbSB3ZWJzaXRlcyB1c2luZyBhbGdvcml0aG1zIHRvIGF1dG9tYXRlIHRoZSBjb2xsZWN0aW9uIHByb2Nlc3MuIE1ldGhvZHMgc2ltaWxhciB0byBvbmVzIEkgaGF2ZSBpbXBsZW1lbnRlZCBpbiB0aGlzIHRoZXNpcyBoYXZlIGJlZW4gdXNlZCBieSBlc3RhYmxpc2hlZCBhdXRob3JzIHN1Y2ggYXMgKipCb3JkZSBldCBhbC4sIFDDqXJlei1SYXZlIGV0IGFsLiBhbmQgQmVyYXdpIGV0IGFsLioqIAoKSW4gdGhpcyB0aGVzaXMsIEkgaGF2ZSB1c2VkIGEgbWl4dHVyZSBvZiB0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIFIgYW5kIFB5dGhvbiwgc3VwcGxlbWVudGVkIGJ5IHNldmVyYWwgcGFja2FnZXMgY3JlYXRlZCBieSBTZWxlbml1bSwgdG8gd3JpdGUgYW4gYWxnb3JpdGhtIHRoYXQgY29sbGVjdHMgdGhlIHJlcXVpcmVkIGhlZG9uaWMgdmFyaWFibGVzIGZvciB0aGlzIHJlc2VhcmNoIGZyb20gdGhlIE11bHRpcGxlIExpc3RpbmcgU2VydmljZXMgKE1MUykuICoqVGFibGUgMSoqIGlzIGEgc3VtbWFyeSBvZiB0aGUgb3JpZ2luYWwgZGF0YSBzZXQncyBrZXkgZmVhdHVyZXMuCgo8YnI+CgpgYGB7ciBsb2FkLXBhY2thZ2VzLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGtuaXRyKQojbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KHJlYWR4bCkgIyBJbXBvcnQgZXhjZWwgZGF0YSBmcmFtZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlueXRleCkKbGlicmFyeShyZWFkeGwpICMgSW1wb3J0IGV4Y2VsIGRhdGEgZnJhbWVzCmxpYnJhcnkoZ2dwbG90MikgIyBHcmFwaHMKbGlicmFyeShzY2FsZXMpICMgU2NhbGUgcmFuZ2Ugb2YgZ2dwbG90cyAKbGlicmFyeShnZ2ZvcnRpZnkpICMgQWRkaXRpb25hbCBnZ3Bsb3QyIGZ1bmN0aW9uYWxpdHkKbGlicmFyeShvbHNycikgIyBUZXN0aW5nIGZvciBoZXRlcm9zY2VkYXN0aWNpdHkKbGlicmFyeShsbXRlc3QpICMgVGVzdGluZyBmb3IgaGV0ZXJvc2NlZGFzdGljaXR5IHVzaW5nIGJyZXVjaC1wYWdhbgpsaWJyYXJ5KHNhbmR3aWNoKSAjIEFtZW5kaW5nIGhldGVyb3NrZWRhc3RpY2l0eSAKbGlicmFyeShtY3ZpcykgIyBWaXN1YWxpemluZyBtdWx0aWNvbGxpbmVhcml0eQpsaWJyYXJ5KGdyaWRFeHRyYSkgIyBPcmdhbml6ZSBncmFwaHMKbGlicmFyeShkcGx5cikgIyBkYXRhX2ZhY3RvciB3cmFuZ2xpbmcKbGlicmFyeSh0aWR5cikgIyBkYXRhX2ZhY3RvciB3cmFuZ2xpbmcKbGlicmFyeSh0aW55dGV4KSAjZm9yIFJNYXJrZG93bgpsaWJyYXJ5KG9wZW54bHN4KSAjRXhwb3J0IGRhdGEgZnJhbWUgaW50byBFeGNlbApsaWJyYXJ5KGdnZWZmZWN0cykgIyBwbG90dGluZyBtYXJnaW5hbCBlZmZlY3RzCmxpYnJhcnkoc2pQbG90KSAjIHBsb3R0aW5nIG1hcmdpbmFsIGVmZmVjdHMKbGlicmFyeShzdGFyZ2F6ZXIpICMgU2hvd2luZyBzZXZlcmFsIG91dHB1dHMgbmV4dCB0byBlYWNoIG90aGVyIGluIGEgU1RBVEEgc3R5bGUKbGlicmFyeShtb2RlbHN1bW1hcnkpICMgU2hvd2luZyBzZXZlcmFsIG91dHB1dHMgbmV4dCB0byBlYWNoIG90aGVyIGluIGEgU1RBVEEgc3R5bGUKbGlicmFyeShyZWdjbGFzcykgIyBmb3IgdGVzdGluZyBtdWx0aWNvbGxpbmVhcml0eSB1c2luZyBWSUYKbGlicmFyeShqdG9vbHMpICMgY2xlYW5lciByZWdyZXNzaW9uIG91dHB1dCAoZS5nLiBzdW1tKGxtKSAKbGlicmFyeSh0aWR5dmVyc2UpICMgZGF0YSBjbGVhbmluZwpsaWJyYXJ5KGhyYnJ0aGVtZXMpICMgc3BlY2lhbCBib3hwbG90cwpsaWJyYXJ5KHZpcmlkaXMpICMgc3BlY2lhbCBib3hwbG90cwpsaWJyYXJ5KHBsb3RseSkgIyBGb3IgM0QgcGxvdHRpbmcgaW4gZ2dwbG90MgpsaWJyYXJ5KHJlc2hhcGUyKSAjIENvcnIgaGVhdG1hcApsaWJyYXJ5KGd0KQoKCiNkZXRhY2goInBhY2thZ2U6a2FibGVFeHRyYSIsIHVubG9hZD1UUlVFKQojZGV0YWNoKCJwYWNrYWdlOmtuaXRyIiwgdW5sb2FkPVRSVUUpCgojIEltcG9ydCBhbmQgYXR0YWNoIGRhdGEgc2V0cwpkYXRhX2ZhY3RvciA8LSByZWFkX2V4Y2VsKCIvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvTW9kZWxzL0RhdGEvTmV3IERhdGEvMy4gZGF0YV9mYWN0b3JfY2xlYW5lZC54bHN4IikKYXR0YWNoKGRhdGFfZmFjdG9yKQoKIyBDb252ZXJ0IENoYXIgdG8gRmFjdG9ycyB3aXRoIE4gTGV2ZWxzCiMgU3RydWN0dXJlIENoYW5nZQpkYXRhX2ZhY3RvciRwcm9wZXJ0eV90eXBlIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRwcm9wZXJ0eV90eXBlKQpkYXRhX2ZhY3RvciRhY190eXBlIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRhY190eXBlKQpkYXRhX2ZhY3RvciRwYXRpbyA8LSBhcy5mYWN0b3IoZGF0YV9mYWN0b3IkcGF0aW8pCmRhdGFfZmFjdG9yJHNjaG9vbF9nZW5lcmFsIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRzY2hvb2xfZ2VuZXJhbCkKZGF0YV9mYWN0b3IkcG9vbCA8LSBhcy5mYWN0b3IoZGF0YV9mYWN0b3IkcG9vbCkKZGF0YV9mYWN0b3Ikcm9vZl90eXBlIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRyb29mX3R5cGUpCmRhdGFfZmFjdG9yJGdhc190eXBlIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRnYXNfdHlwZSkKZGF0YV9mYWN0b3Ikb3V0X2J1aWxkaW5nIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRvdXRfYnVpbGRpbmcpCgpkYXRhX2ZhY3RvciRhcHBsaWFuY2VzIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRhcHBsaWFuY2VzKQpkYXRhX2ZhY3RvciRnYXJhZ2UgPC0gYXMuZmFjdG9yKGRhdGFfZmFjdG9yJGdhcmFnZSkKZGF0YV9mYWN0b3IkcHJvcGVydHlfY29uZGl0aW9uIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRwcm9wZXJ0eV9jb25kaXRpb24pCmRhdGFfZmFjdG9yJGVuZXJneV9lZmZpY2llbnQgPC0gYXMuZmFjdG9yKGRhdGFfZmFjdG9yJGVuZXJneV9lZmZpY2llbnQpCmRhdGFfZmFjdG9yJGV4dGVyaW9yX3R5cGUgPC0gYXMuZmFjdG9yKGRhdGFfZmFjdG9yJGV4dGVyaW9yX3R5cGUpCmRhdGFfZmFjdG9yJGV4dGVyaW9yX2ZlYXR1cmVzIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRleHRlcmlvcl9mZWF0dXJlcykKZGF0YV9mYWN0b3IkZmlyZXBsYWNlIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRmaXJlcGxhY2UpCmRhdGFfZmFjdG9yJGZvdW5kYXRpb25fdHlwZSA8LSBhcy5mYWN0b3IoZGF0YV9mYWN0b3IkZm91bmRhdGlvbl90eXBlKQpkYXRhX2ZhY3RvciRiZWRzX3RvdGFsIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRiZWRzX3RvdGFsKQpkYXRhX2ZhY3RvciRiYXRoX2Z1bGwgPC0gYXMuZmFjdG9yKGRhdGFfZmFjdG9yJGJhdGhfZnVsbCkKZGF0YV9mYWN0b3IkYmF0aF9oYWxmIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRiYXRoX2hhbGYpCmRhdGFfZmFjdG9yJHNld2VyX3R5cGUgPC0gYXMuZmFjdG9yKGRhdGFfZmFjdG9yJHNld2VyX3R5cGUpCmRhdGFfZmFjdG9yJHByb3BlcnR5X3N0eWxlIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRwcm9wZXJ0eV9zdHlsZSkKZGF0YV9mYWN0b3Ikc3ViZGl2aXNpb24gPC0gYXMuZmFjdG9yKGRhdGFfZmFjdG9yJHN1YmRpdmlzaW9uKQpkYXRhX2ZhY3RvciR3YXRlcl90eXBlIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciR3YXRlcl90eXBlKQpkYXRhX2ZhY3RvciR3YXRlcmZyb250IDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciR3YXRlcmZyb250KQpkYXRhX2ZhY3RvciRzb2xkX2RhdGUgPC0gb3Blbnhsc3g6OmNvbnZlcnRUb0RhdGUoZGF0YV9mYWN0b3Ikc29sZF9kYXRlKQpkYXRhX2ZhY3RvciRzb2xkX2RhdGUgPC0gYXMubnVtZXJpYyhkYXRhX2ZhY3RvciRzb2xkX2RhdGUpCgpzdHIoZGF0YV9mYWN0b3IpCgojIFNwbGl0cwpkYXRhX2ZhY3RvciRjaXR5X2xpbWl0cyA8LSBhcy5mYWN0b3IoZGF0YV9mYWN0b3IkY2l0eV9saW1pdHMpCmRhdGFfZmFjdG9yJGNvcm9uYV9kYXRlX3NwbGl0IDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRjb3JvbmFfZGF0ZV9zcGxpdCkKZGF0YV9mYWN0b3IkdG9wMjVfc29sZF9wcmljZSA8LSBhcy5mYWN0b3IoZGF0YV9mYWN0b3IkdG9wMjVfc29sZF9wcmljZSkKZGF0YV9mYWN0b3IkYm90dG9tMjVfc29sZF9wcmljZSA8LSBhcy5mYWN0b3IoZGF0YV9mYWN0b3IkYm90dG9tMjVfc29sZF9wcmljZSkKZGF0YV9mYWN0b3IkdG9wMjVfYXJlYV9saXZpbmcgPC0gYXMuZmFjdG9yKGRhdGFfZmFjdG9yJHRvcDI1X2FyZWFfbGl2aW5nKQpkYXRhX2ZhY3RvciRib3R0b20yNV9hcmVhX2xpdmluZyAgPC0gYXMuZmFjdG9yKGRhdGFfZmFjdG9yJGJvdHRvbTI1X2FyZWFfbGl2aW5nKQpkYXRhX2ZhY3RvciR0b3AyNV9hZ2UgPC0gYXMuZmFjdG9yKGRhdGFfZmFjdG9yJHRvcDI1X2FnZSkKZGF0YV9mYWN0b3IkYm90dG9tMjVfYWdlIDwtIGFzLmZhY3RvcihkYXRhX2ZhY3RvciRib3R0b20yNV9hZ2UpCmRhdGFfZmFjdG9yJHRvcDI1X2RvbSA8LSBhcy5mYWN0b3IoZGF0YV9mYWN0b3IkdG9wMjVfZG9tKQpkYXRhX2ZhY3RvciRib3R0b20yNV9kb20gPC0gYXMuZmFjdG9yKGRhdGFfZmFjdG9yJGJvdHRvbTI1X2RvbSkKZGF0YV9mYWN0b3IkaW5mZWN0aW9uc19wZXJpb2QgPC0gYXMubnVtZXJpYyhkYXRhX2ZhY3RvciRpbmZlY3Rpb25zX2FjY3VtID4gMTAwMCkKZGF0YV9mYWN0b3IkaW5mZWN0aW9uc19wZXJpb2QgPC0gYXMuZmFjdG9yKGRhdGFfZmFjdG9yJGluZmVjdGlvbnNfcGVyaW9kKQoKc3RyKGRhdGFfZmFjdG9yKQoKIyBSZW1vdmUgdGhpcyB3ZWlyZCAnMjAnIGxldmVsIGlzIGJhdGhfZnVsbApsZXZlbHMoZGF0YV9mYWN0b3IkYmF0aF9mdWxsKQppcy5uYShkYXRhX2ZhY3RvciRiYXRoX2Z1bGwpIDwtIGRhdGFfZmFjdG9yJGJhdGhfZnVsbCA9PSAiMjAiCmRhdGFfZmFjdG9yJGJhdGhfZnVsbCA8LSBmYWN0b3IoZGF0YV9mYWN0b3IkYmF0aF9mdWxsKQpsZXZlbHMoZGF0YV9mYWN0b3IkYmF0aF9mdWxsKQoKIyBSZW1vdmUgYmVkc190b3RhbCA+IDUKbGV2ZWxzKGRhdGFfZmFjdG9yJGJlZHNfdG90YWwpCmlzLm5hKGRhdGFfZmFjdG9yJGJlZHNfdG90YWwpIDwtIGRhdGFfZmFjdG9yJGJlZHNfdG90YWwgPT0gIjciIApkYXRhX2ZhY3RvciRiZWRzX3RvdGFsIDwtIGZhY3RvcihkYXRhX2ZhY3RvciRiZWRzX3RvdGFsKQppcy5uYShkYXRhX2ZhY3RvciRiZWRzX3RvdGFsKSA8LSBkYXRhX2ZhY3RvciRiZWRzX3RvdGFsID09ICI2IiAKZGF0YV9mYWN0b3IkYmVkc190b3RhbCA8LSBmYWN0b3IoZGF0YV9mYWN0b3IkYmVkc190b3RhbCkKbGV2ZWxzKGRhdGFfZmFjdG9yJGJlZHNfdG90YWwpCgoKCmxldmVscyhkYXRhX2ZhY3RvciRiZWRzX3RvdGFsKQpsZXZlbHMoZGF0YV9mYWN0b3IkYmF0aF9mdWxsKQpsZXZlbHMoZGF0YV9mYWN0b3IkYmF0aF9oYWxmKQoKIyBEYXRhIGZyYW1lIHdpdGhvdXQgU3BsaXQgVmFycwpuYW1lcyhkYXRhX2ZhY3RvcikKZGF0YV9mYWN0b3JfY29yZSA8LSBkYXRhX2ZhY3RvclstYygzNjo0NyldCmRhdGFfZmFjdG9yX2NvcmUgPC0gc3Vic2V0KGRhdGFfZmFjdG9yX2NvcmUsIHNlbGVjdCA9IC1jKGNpdHlfbGltaXRzLCBtbHNfbnVtYmVyLCBpbmZlY3Rpb25zX3BlcmlvZCkpCnN0cihkYXRhX2ZhY3Rvcl9jb3JlKQpuYW1lcyhkYXRhX2ZhY3Rvcl9jb3JlKQoKCgpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQoKbGlicmFyeShyZWFkeGwpICMgSW1wb3J0IGV4Y2VsIGRhdGEgZnJhbWVzCmRmMSA8LSBzdXBwcmVzc01lc3NhZ2VzKHJlYWRfZXhjZWwoIi9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvVGFibGVzL1RhYmxlX0RhdGFfR2VuX0RpbWluc2lvbnMueGxzeCIpKQpkZjEgPC0gZGYxWywxOjJdCmNvbG5hbWVzKGRmMSkgPC0gYygiTmFtZSIsICJJbmZvcm1hdGlvbiIpCgoKdGFibGUxIDwtIGd0KGRmMSkKdGFibGUxIDwtIHRhYmxlMSAlPiUgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCJWYXJpYWJsZSBMaXN0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBtZCgiKlN0cnVjdHVyZSBhbmQgc2hvcnQgZGlzY3JpcHRpb24qIikpCnRhYmxlMQpgYGAKPGJyPgoKYGBge3IgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9CiMgVGFibGUgMgpkZjIgPC0gc3VwcHJlc3NNZXNzYWdlcyhyZWFkX2V4Y2VsKCIvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1RhYmxlcy90YWJsZV9kYXRhX2RpbWVuc2lvbnNfb3JpZ2luYWwueGxzeCIpKQpkZjIgPC0gZGYyWywxOjNdCmNvbG5hbWVzKGRmMikgPC0gYygiVmFyaWFibGUgVHlwZSIsICJWYXJpYWJsZXMiLCAiT2JzZXJ2YXRpb25zIikKCnRhYmxlMiA8LSBndChkZjIpCnRhYmxlMiA8LSB0YWJsZTIgJT4lIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiVmFyaWFibGUgTGlzdCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gbWQoIipTdHJ1Y3R1cmUgYW5kIHNob3J0IGRpc2NyaXB0aW9uKiIpKQp0YWJsZTIKCiMgSm9pbmluZyBDb2RlCiMgVW5kZXIgY29uc3RydWN0aW9uCgpgYGAKCiMjIyMgMy4yIERhdGEgUHJvY2Vzc2luZwoKVGhvdWdoIHRoZSBkYXRhLWNvbGxlY3RpbmcgYWxnb3JpdGhtcyByZXR1cm4gc3RydWN0dXJlZCBkYXRhLCBpdCBpcyBuZXZlcnRoZWxlc3MgZmFyIGZyb20gYmVpbmcgc3VpdGFibGUgZm9yIHRoZSByYXRoZXIgcGlja3kKbW9kZWxzIHdoaWNoIHdpbGwgZXZlbnR1YWxseSBhbmFseXplIHRoZW0uIFRoZXJlZm9yZSwgdGhlIGZvbGxvd2luZyBwcm9jZXNzZXMgd2VyZSBjb21wbGV0ZWQgaW4gb3JkZXIgdG8gcmVuZGVyIHRoZSByYXcgZGF0YQppbnRvIGEgdXNhYmxlIGZvcm06CgoxLiAqKk1pc3NpbmcgdmFsdWVzKiogKGkuZS4gTi9BIHZhbHVlcykgd2VyZSByZW1vdmVkIAoyLiAqKk91dGxpZXJzKiogd2VyZSBpZGVudGlmaWVkIGFuZCByZW1vdmVkIGZvciBhbGwgY29udGludW91cyB2YXJpYWJsZXMKICAgKyBBbiAnb3V0bGllcicgaXMgZGVmaW5lZCBieSBiZWluZyBtb3JlIHRoYW4gMS41IHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbiBvZiB0aGUgdmFyaWFibGUncyBvd24gZGlzdHJpYnV0aW9uCjMuICoqTXVsdGlsZXZlbCBmYWN0b3IqKiBkYXRhIHdhcyBicm9rZW4gb3V0IGJ5IGVhY2ggbGV2ZWwgaW50byBiaW5hcnkgcmVwcmVzZW50YXRpb25zIHRocm91Z2ggKkhvdC1PbmUqIGNvZGluZwogICArIFNvbWUgZmVhdHVyZXMgd2hpY2ggaGFkIGEgbGFyZ2UgbnVtYmVyIG9mIGZhY3RvciBsZXZlbHMgd2VyZSBzaW1wbGlmaWVkIHVzaW5nIExhc3NvIHJlZ3Jlc3NpdmUgbWV0aG9kcwo0LiAqKkhpZ2gtbGV2ZXJhZ2UqKiBwb2ludCBvYnNlcnZhdGlvbnMsIGFjY29yZGluZyB0byBkaWFnbm9zdGljIGxpbmVhciByZWdyZXNzaW9uLCB3ZXJlIHJlbW92ZWQKNS4gKipEdXBsaWNhdGVzKiosIGRlZmluZWQgYnkgdGhlIE1MUyB1bmlxdWUgaWRlbnRpZmljYXRpb24gbnVtYmVyLCB3ZXJlIHJlbW92ZWQKNi4gKipTdHJ1Y3R1cmFsIGVycm9ycyoqIChlLmcuIGRhdGVzIHN0cnVjdHVyZWQgYXMgc3RyaW5nIHZhcmlhYmxlKSB3ZXJlIGNvcnJlY3RlZAo3LiAqKkJpbmFyeSB2YXJpYWJsZXMqKiB3ZXJlIGNyZWF0ZWQgZm9yIGtleSB2YXJpYWJsZXMgKGUuZy4gY2l0eV9saW1pdHMpIGJ5IHRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgbWV0aG9kOgoKJCRJXGxlZnQoeVxyaWdodCk9XGxlZnRce1xiZWdpbnthcnJheX17bGx9MSxccXVhZCB4XGluIEFcXDAsIFxxdWFkIHggXG5vdGluIEFcZW5ke2FycmF5fVxyaWdodC4sJCQKV2hlcmUgJEkkIGlzIGFuIGluZGljYXRvciBmdW5jdGlvbiB3aXRoIHNwYWNlICRBJCB0aGF0IGNvbXBvc2VzIGR1bW15IHZhcmlhYmxlICR4JCBpbnRvICQxJCBpZiB0aGUgY29uZGl0aW9uIGlzIG1ldCBhbmQgaW50byAkMCQgaWYgaXQgaXMgbm90LgoKPGJyPgoKVGhlIHJlc3VsdHMgb2YgdGhlIGRhdGEgY2xlYW5pbmcgcHJvY2Vzc2VzIGNhbmUgYmUgc2VlbiBpbiAqKnRhYmxlIDIqKi4KCmBgYHtyIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQojIENsZWFuZWQgRGF0YSBTZXQgU3VtbWFyeQpkZjEgPC0gc3VwcHJlc3NNZXNzYWdlcyhyZWFkX2V4Y2VsKCIvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1RhYmxlcy9UYWJsZV9EYXRhX0dlbl9EaW1pbnNpb25zLnhsc3giKSkKCnRhYmxlMSA8LSBndChkZjEpCnRhYmxlMSA8LSB0YWJsZTEgJT4lIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiVmFyaWFibGUgTGlzdCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gbWQoIipTdHJ1Y3R1cmUgYW5kIHNob3J0IGRpc2NyaXB0aW9uKiIpKQp0YWJsZTEKYGBgCgo8YnI+CgpgYGB7ciBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30KIyBDbGVhbmVkIERhdGEgU3RydWN0dXJlIE92ZXJ2aWV3CmRmMiA8LSBzdXBwcmVzc01lc3NhZ2VzKHJlYWRfZXhjZWwoIi9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvVGFibGVzL3RhYmxlX2RhdGFfZGltZW5zaW9uc19vcmlnaW5hbC54bHN4IikpCmRmMiA8LSBkZjIgJT4lIHNlbGVjdCgxLCA0OjUpCgpjb2xuYW1lcyhkZjIpIDwtIGMoIlZhcmlhYmxlIFR5cGUiLCAiVmFyaWFibGVzIiwgIk9ic2VydmF0aW9ucyIpCgp0YWJsZTIgPC0gZ3QoZGYyKQp0YWJsZTIgPC0gdGFibGUyICU+JSB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIlZhcmlhYmxlIExpc3QiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IG1kKCIqU3RydWN0dXJlIGFuZCBzaG9ydCBkaXNjcmlwdGlvbioiKSkKdGFibGUyCgpgYGAKCgoKIyMjIyAzLjMgVmFyaWFibGUgTGlzdAoKYGBge3IgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9CiMgQ2xlYW5lZCBEYXRhIFNldCBTdW1tYXJ5CmRmMyA8LSBzdXBwcmVzc01lc3NhZ2VzKHJlYWRfZXhjZWwoIi9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvVGFibGVzL1ZhcmlhYmxlX3RhYmxlLnhsc3giKSkKCnRhYmxlMSA8LSBndChkZjMpCnRhYmxlMSA8LSB0YWJsZTEgJT4lIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiVmFyaWFibGUgTGlzdCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gbWQoIipTdHJ1Y3R1cmUgYW5kIHNob3J0IGRpc2NyaXB0aW9uKiIpKQoKdGFibGUxCmBgYAoKPGJyPjxicj4KCiMjIyMgMy4zIERhdGEgRGlzdHJpcHRpdmUgU3RhdGlzdGljcwoKYGBge3IgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShyZWFkeGwpICMgSW1wb3J0IGV4Y2VsIGRhdGEgZnJhbWVzCmxpYnJhcnkoZ2dwbG90MikgIyBHcmFwaHMKbGlicmFyeShzY2FsZXMpICMgU2NhbGUgcmFuZ2Ugb2YgZ2dwbG90cyAKbGlicmFyeShnZ2ZvcnRpZnkpICMgQWRkaXRpb25hbCBnZ3Bsb3QyIGZ1bmN0aW9uYWxpdHkKbGlicmFyeShvbHNycikgIyBUZXN0aW5nIGZvciBoZXRlcm9zY2VkYXN0aWNpdHkKbGlicmFyeShsbXRlc3QpICMgVGVzdGluZyBmb3IgaGV0ZXJvc2NlZGFzdGljaXR5IHVzaW5nIGJyZXVjaC1wYWdhbgpsaWJyYXJ5KHNhbmR3aWNoKSAjIEFtZW5kaW5nIGhldGVyb3NrZWRhc3RpY2l0eSAKbGlicmFyeShtY3ZpcykgIyBWaXN1YWxpemluZyBtdWx0aWNvbGxpbmVhcml0eQpsaWJyYXJ5KGdyaWRFeHRyYSkgIyBPcmdhbml6ZSBncmFwaHMKbGlicmFyeShkcGx5cikgIyBkYXRhX2ZhY3RvciB3cmFuZ2xpbmcKbGlicmFyeSh0aWR5cikgIyBkYXRhX2ZhY3RvciB3cmFuZ2xpbmcKbGlicmFyeSh0aW55dGV4KSAjZm9yIFJNYXJrZG93bgpsaWJyYXJ5KG9wZW54bHN4KSAjRXhwb3J0IGRhdGEgZnJhbWUgaW50byBFeGNlbApsaWJyYXJ5KGdnZWZmZWN0cykgIyBwbG90dGluZyBtYXJnaW5hbCBlZmZlY3RzCmxpYnJhcnkoc2pQbG90KSAjIHBsb3R0aW5nIG1hcmdpbmFsIGVmZmVjdHMKbGlicmFyeShzdGFyZ2F6ZXIpICMgU2hvd2luZyBzZXZlcmFsIG91dHB1dHMgbmV4dCB0byBlYWNoIG90aGVyIGluIGEgU1RBVEEgc3R5bGUKbGlicmFyeShtb2RlbHN1bW1hcnkpICMgU2hvd2luZyBzZXZlcmFsIG91dHB1dHMgbmV4dCB0byBlYWNoIG90aGVyIGluIGEgU1RBVEEgc3R5bGUKbGlicmFyeShyZWdjbGFzcykgIyBmb3IgdGVzdGluZyBtdWx0aWNvbGxpbmVhcml0eSB1c2luZyBWSUYKbGlicmFyeShqdG9vbHMpICMgY2xlYW5lciByZWdyZXNzaW9uIG91dHB1dCAoZS5nLiBzdW1tKGxtKSAKbGlicmFyeSh0aWR5dmVyc2UpICMgZGF0YSBjbGVhbmluZwpsaWJyYXJ5KGhyYnJ0aGVtZXMpICMgc3BlY2lhbCBib3hwbG90cwpsaWJyYXJ5KHZpcmlkaXMpICMgc3BlY2lhbCBib3hwbG90cwpsaWJyYXJ5KHBsb3RseSkgIyBGb3IgM0QgcGxvdHRpbmcgaW4gZ2dwbG90MgpsaWJyYXJ5KHJlc2hhcGUyKSAjIENvcnIgaGVhdG1hcAoKIyBDb2xvcnMKdmVyeV9sb3cgPC0gIiM0NjBmNWMiCmxvdyA8LSAiIzJjNzI4ZSIKbWVkIDwtICIjMjdhZDgxIgpoaWdoIDwtICIjZjRlNjFlIgoKIyBJbXBvcnQgYW5kIGF0dGFjaCBkYXRhIHNldHMKIyBVcGxvYWQgYW5kIHByb2Nlc3MgZGF0YV9mYWN0b3IgZnJvbSBPTFNfVGhlc2lzCgpgYGAKCiMjIyMjIDMuMy4xIENvcnJlbGF0aW9uIAoKVGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBiZXR3ZWVuIGFsbCBudW1lcmljIHZhcmlhYmxlcyBzaG93cyB0aGF0IHdpdGggZXhjZXB0aW9uIHRvIHRoZSB2YXJpYWJsZXMgd2hpY2ggd2lsbCBoYXZlIG9idmlvdXMgY29ycmVsYXRpb25zIChlLmcuIHNvbGRfcHJpY2UgYW5kIGxpc3RfcHJpY2UsIGFyZWFfdG90YWwgYW5kIGFyZWFfbGl2aW5nLCBhbmQgaW5mZWN0aW9ucyBmaWd1cmVzKSwgdGhlcmUgYXJlIG5vIG90aGVyIGNvcnJlbGF0aW9ucyB3aGljaCB3b3VsZCBjYXVzZSBjb25jZXJuLgoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvY29ycmVsYXRpb25fbWF0cml4LnBuZyl7d2lkdGg9ODAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMjIDMuMy4yIERpc3RyaWJ1dGlvbnMgb2YgU2VsZWN0IFZhcmlhYmxlcwpBcyB0aGUgc3RhbmRhcmQgZGVzY3JpcHRpdmUgY2hhcmFjdGVyaXN0aWNzIG9mIGEgcGFydGljdWxhciB2YXJpYWJsZSBhcmUgY29uc2lkZXJlZCAoaS5lLiBtZWFzdXJlcyBvZiBmcmVxdWVuY3ksIGNlbnRyYWwgdGVuZGVuY3ksIGRpc3BlcnNpb24sIGFuZCBwb3NpdGlvbiksIHRoZSBtYXRyaXggb2YgZGVuc2l0eSBwbG90cyBiZWxvdyBnaXZlIHVzIGEgZ29vZCBvdmVydmlldyBvZiB0aGUgbW9zdCByZWxldmFudCB2YXJpYWJsZXMgaW4gdGhpcyBkYXRhIHNldC4gCgo8YnI+CjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1NlbGVjdF92YXJfc3VtbWFyeS5wbmcpe3dpZHRoPTEwMCV9CjwvY2VudGVyPgoKIyMjIyMgMy4zLjMgUHJpY2UgSW5kZXgKVW5kZXIgQ29uc3RydWN0aW9uCgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9JbmRleC5wbmcpe3dpZHRoPTkwJX0KPC9jZW50ZXI+CgoKCjxicj48YnI+CgojIyMgNC4gTWV0aG9kb2xvZ3kKVGhlIG92ZXJhcmNoaW5nIG1ldGhvZCB1c2VkIGluIHRoaXMgdGhlc2lzIGlzIHRoZSBIZWRvbmljIFByaWNpbmcgTWV0aG9kIChIUE0pLCBhbHNvIG9mdGVuIHJlZmVycmVkIHRvIGFzIGhlZG9uaWMgcmVncmVzc2lvbiBvciBoZWRvbmljIGRlbWFuZCB0aGVvcnkuIFRoZSBmdW5kYW1lbnRhbCB0aGVvcnkgYmVoaW5kIHRoZSBIUE0gaXMgdGhlIGZvbGxvd2luZzogY29tbW9kaXRpZXMgYXJlIGRpc3Rpbmd1aXNoYWJsZSBieSB0aGVpciBjb21wb25lbnQgcGFydHMsIHRoZXJlZm9yZSwgdGhlIG1hcmtldCB2YWx1ZSBvZiBhIGdpdmVuIGNvbW1vZGl0eSBjYW4gYmUgY2FsY3VsYXRlZCBieSBzdW1taW5nIHRoZSBlc3RpbWF0ZWQgdmFsdWVzIG9mIGl0cyBzZXBhcmF0ZSBjaGFyYWN0ZXJpc3RpY3MuIEZvciB0aGlzIHRoZW9yeSB0byBob2xkIHRydWUsIHNldmVyYWwgY3JpdGljYWwgcmVxdWlyZW1lbnQgbXVzdCBiZSBtZXQuIFByaW1hcmlseSwgdGhhdCB0aGUgY29tbW9kaXR5IGJlaW5nIHZhbHVlZCBjYW4gYmUgcmVkdWNlZCBkb3duIHRvIGl0J3MgY29tcG9uZW50IHBhcnRzIGFuZCB0aGF0IHRoZSBtYXJrZXQgaXMgYWJsZSB0byBpbXBsaWNpdGx5IGFuZCBpbmRlcGVuZGVudGx5IHZhbHVlIHRoZXNlIGNoYXJhY3RlcmlzdGljcy4gVGhlIGZ1bGZpbGxtZW50IG9mIHRoZXNlIHJlcXVpcmVtZW50cyBhcmUgbm90IG9idmlvdXMgYW5kIGluIHJlYWxpdHkgd2lsbCBpbiBzb21lIG1lYXN1cmUgZmFsbCBzaG9ydCBvZiBhY2NvdW50aW5nIGZvciB0aGUgY29tcGxldGUgbmF0dXJlIG9mIHByaWNlIGR5bmFtaWNzIGluIHByYWN0aWNhbGx5IGV2ZXJ5IGFzc2V0IGNsYXNzLiBIb3dldmVyLCB0aGlzIGxpbWl0YXRpb24gb2ZmZXJzIGFuIGludGVyZXN0aW5nIHByb2JsZW0gdG8gdGVzdC4gTmFtZWx5LCB0byBmaW5kIHRoZSBsaW1pdCBvZiB0aGUgYWNjdW11bGF0ZWQgcG93ZXIgb2YgdGhlc2UgY29tcG9uZW50IHBhcnRzIHRvIGFjY291bnQgZm9yIG1hcmtldCB2YWx1ZXMgYW5kIHRoZWlyIGRldmlhdGlvbnMgYWNyb3NzIHRpbWUgYW5kIHN1Ymdyb3Vwcy4gVGhpcyBleGFjdCBxdWVzdGlvbnMgd2lsbCBiZSBsYXRlciBleGFtaW5lZCBieSBpbXBsZW1lbnRpbmcgYSBtYWNoaW5lLWxlYXJuZWQgcHJlZGljdGl2ZSBtb2RlbCB0byBtZWFzdXJlIHRoZSB0aGVvcmV0aWNhbCBtYXhpbXVtIGV4cGxhbmF0b3J5IHBvd2VyIG9mIHRoZSBpbmNsdWRlZCBoZWRvbmljIHZhcmlhYmxlcy4gSW4gdGhlIGZvbGxvd2luZyB0d28gc3Vic2VjdGlvbnMsIHdlIHJldmlldyB0aGUgbWV0aG9kcyB1c2VkIGluIHRoaXMgcGFwZXIgdG8gZWNvbm9tZXRyaWNhbGx5IG1vZGVsIHRoZSBIUE0gb24gaGVkb25pYyByZWFsIGVzdGF0ZSBkYXRhLgoKPGJyPgoKIyMjIyA0LjEgTXVsdGktVmFyaWFibGUgTGluZWFyIFJlZ3Jlc3Npb24gCkluIHRoaXMgc2VjdGlvbiwgSSB3aWxsIG91dGxpbmUgdGhlIGNvbnN0cnVjdGlvbiBvZiBteSBiYXNlIE9MUyBtb2RlbCwgdGVybWVkIHRoZSBBbHBoYSBtb2RlbCwgYXMgd2VsbCBhcyB0aGUgdHJlYXRtZW50IHByb2Nlc3MgZm9yIGhldGVyb3NrYWRhc3RpY2l0eSwgbXVsdGljb2xpbmVhcml0eSwgbm9uLWxpbmVhcml0eSwgYW5kIGhpZ2gtbGV2ZXJhZ2UgcG9pbnRzIGFuZCBvdXRsaWVycy4gIAoKIyMjIyMgNC4xLjEgQmFzaWMgTW9kZWwgRGVzaWduCgpGb2xsb3dpbmcgdGhlIE9MUyBjb25zdHJ1Y3Rpb24gbGFpZCBvdXQgYnkgQEhlcmF0aDE6CgokJApSID0gZihQLE4sTCx0KQokJAp3aGVyZSAkUiQgaXMgcmVudCBvciBwcmljZSBvZiB0aGUgcHJvcGVydHk7ICRQJCBpcyBwcm9wZXJ0eSByZWxhdGVkIGF0dHJpYnV0ZXM7ICROJCBpcyBuZWlnaGJvcmhvb2QgY2hhcmFjdGVyaXN0aWNzOyAkTCQgaXMgbG9jYXRpb25hbCB2YXJpYWJsZXMgYW5kOyAkdCQgaXMgYW4gaW5kaWNhdG9yIG9mIHRpbWUuCgpUaGlzIHBhcGVyJ3MgYmFzZSBPTFMgbW9kZWwsIG5hbWVkIHRoZSBBbHBoYSBtb2RlbCwgaXMgYXMgZm9sbG93czoKCiQkCntQfV97blx0aW1lczF9ID0gXCBBX3tuXHRpbWVzMX0gXCArIFwgIEJfe2tcdGltZXMxfXtWfV97blx0aW1lcyBrfSBcICsgIFwgXG1hdGhjYWx7RX1fe25cdGltZXMxfQokJAoKd2hlcmUgJFAkIGlzIGEgJHtuXHRpbWVzMX0kIHZlY3RvciBvZiBzb2xkIHByaWNlczsgJEEkIGlzIGEgJHtuXHRpbWVzMX0kIHZlY3RvciBvZiB0aGUgbW9kZWwncyBpbnRlcmNlcHRzOyAkQiQgaXMgYSAke2tcdGltZXMxfSQgdmVjdG9yIG9mIGJldGEgY29lZmZpY2llbnRzOyAkViQgaXMgYSAke25cdGltZXMga30kIG1hdHJpeCBvZiBhbGwgaGVkb25pYyB2YXJpYWJsZXM7ICRcbWF0aGNhbHtFfSQgaXMgYSAke25cdGltZXMxfSQgdmVjdG9yIG9mIHRoZSBtb2RlbCdzIHJhbmRvbSBlcnJvcjsgc3Vic2NyaXB0ICRuJCBpcyB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBhbmQ7ICRrJCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB2YXJpYWJsZSBsaXN0LgoKPGJyPgoKIyMjIyMgNC4xLjIgQWNjb3VudGluZyBmb3IgSGV0ZXJvc2NhZGFzdGljaXR5CkEgQnJldXNjaC1QYWdhbiB0ZXN0IHdhcyBjb25kdWN0ZWQgb24gYSBzdGFuZGFyZCBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB3aXRoIHNvbGQgcHJpY2UgYXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIGRhdGFzZXQgYXMgcmVncmVzc29ycy4gVGhlIEJyZXVzY2gtUGFnYW4gKEJQKSB0ZXN0IHdhcyBlc3RhYmxpc2hlZCBhcyBhIG1ldGhvZCBpbiAxOTc5IGFuZCBmb2xsb3dzIHRoZSBsb2dpYyBzZXQgYnkgdGhlIExhZ3JhbmdlIG11bHRpcGxpZXIgdGVzdCBwcmluY2lwbGUgW0BCcmV1c2NoXS4gVGhpcyB0ZXN0IHRlc3RzIHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCB0aGUgdmFyaWFuY2UgaW4gdGhlIG1vZGVsJ3MgZXJyb3JzIGlzIGluZGVwZW5kZW50IGZyb20gbW9kZWwncyByZWdyZXNzb3JzIChpLmUuIGhldGVyb3NjYWRhc3RpY2l0eSkuIFRoZSB0ZXN0J3MgcmVzdWx0cyBpbiBhIHJlamVjdGlvbnMgb2YgdGhlIG51bGwgaHlwb3RoZXNpcywgdGhlcmVieSBmaW5kaW5nIHRoZSBiYXNlIG1vZGVsIHRvIGJlIGhldGVyb3NrZWRhc3RpYy4gVGhlIHJlc3VsdHMgb2YgdGhpcyB0ZXN0IGFyZSBzdW1tYXJpemVkIGluICp0YWJsZSB4Ki4KCjxicj4KCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRmIDwtIHN1cHByZXNzTWVzc2FnZXMocmVhZF9leGNlbCgiL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9UYWJsZXMvQlBfVGVzdC54bHN4IikpCiNkZiA8LSBkZlsxLDFdCgp0YWJsZTEgPC0gZ3QoZGYpCnRhYmxlMSA8LSB0YWJsZTEgJT4lIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiQnJldXNjaCBQYWdhIFRlc3QgZm9yIEhldGVyb3NrZWRhc3RpY2l0eSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gbWQoIipIeXBvdGhlc2VzKiIpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJfc3R5bGUoc3R5bGUgPSAicGFkZGluZy10b3A6MTJweDtwYWRkaW5nLWJvdHRvbToxMnB4OyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25zID0gY2VsbHNfY29sdW1uX2xhYmVscygpKSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJfc3Bhbm5lcihsYWJlbCA9ICJIeXBvdGhlc2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gYyhIeXBvdGhlc2VzKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiX3NwYW5uZXIobGFiZWwgPSAiVGVzdCBTdW1tYXJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zID0gYygiVGVzdCBTdW1tYXJ5IiwgIi0iKSkKdGFibGUxCmBgYAoKPGJyPgoKVG8gcmVzb2x2ZSB0aGUgaGV0ZXJvc2thZGFzdGljaXR5IGZvdW5kIGluIMKnMy40LjEsIEkgd2lsbCBwcm9kdWNlIGhldGVyb3NrZWRhc3RpY2l0eS1jb25zaXN0ZW50IChIQykgc3RhbmRhcmQgZXJyb3JzLCBhbHNvIGtub3duIGFzIGhldGVyb3NrZWRhc3RpY2l0eS1yb2J1c3Qgc3RhbmRhcmQgZXJyb3JzLCB0aHJvdWdoIHRoZSByZWZpbmVkIG1ldGhvZCBlc3RhYmxpc2hlZCBieSBlY29ub21ldHJpY2lhbiBIYWxiZXJ0IEx5bm4gV2hpdGUgW0BXaGl0ZV0uVGhpcyBwcm9jZXNzIGlzIGFzIGZvbGxvd3M6CgpJZiB0aGUgbW9kZWwncyBlcnJvcnMgJHVfe2l9JCBhcmUgaW5kZXBlbmRlbnQsIGJ1dCBoYXZlIGRpc3RpbmN0IHZhcmlhbmNlcyAkXHNpZ21hIF97aX1eezJ9JCB0aGVuICRcU2lnbWEgPVxvcGVyYXRvcm5hbWV7ZGlhZ30oXHNpZ21hIF97MX1eezJ9LFxsZG90cyAsXHNpZ21hIF97bn1eezJ9KSQgd2hpY2ggY2FuIGJlIGVzdGltYXRlZCB3aXRoICR7XGRpc3BsYXlzdHlsZSB7XHdpZGVoYXQge1xzaWdtYSB9fV97aX1eezJ9PXtcd2lkZWhhdCB7dX19X3tpfV57Mn19JC4gVGhpcyByZWxhdGlvbnNoaXAgcHJvZHVjZXMgdGhlIGVzdGltYXRvciBmb3VuZCBpbiBAV2hpdGU6Cgo8YnI+CgokJCB7XGRpc3BsYXlzdHlsZSB7XGJlZ2lue2FsaWduZWR9dl97XHRleHR7SENFfX1cbGVmdFt7XHdpZGVoYXQge1xiZXRhIH19X3tcdGV4dHtPTFN9fVxyaWdodF0mPXtcZnJhYyB7MX17bn19XGxlZnQoe1xmcmFjIHsxfXtufX1cc3VtIF97aX1YX3tpfVhfe2l9J1xyaWdodCleey0xfVxsZWZ0KHtcZnJhYyB7MX17bn19XHN1bSBfe2l9WF97aX1YX3tpfSd7XHdpZGVoYXQge3V9fV97aX1eezJ9XHJpZ2h0KVxsZWZ0KHtcZnJhYyB7MX17bn19XHN1bSBfe2l9WF97aX1YX3tpfSdccmlnaHQpXnstMX1cZW5ke2FsaWduZWR9fX0kJAokJHtcZGlzcGxheXN0eWxlIHtcYmVnaW57YWxpZ25lZH0mPShcbWF0aGJiIHtYfSAnXG1hdGhiYiB7WH0gKV57LTF9KFxtYXRoYmIge1h9ICdcb3BlcmF0b3JuYW1lIHtkaWFnfSAoe1x3aWRlaGF0IHt1fX1fezF9XnsyfSxcbGRvdHMgLHtcd2lkZWhhdCB7dX19X3tufV57Mn0pXG1hdGhiYiB7WH0gKShcbWF0aGJiIHtYfSAnXG1hdGhiYiB7WH0gKV57LTF9LFxlbmR7YWxpZ25lZH19fSQkCgo8YnI+Cgp3aGVyZSAkXG1hdGhiYntYfSQgZGVub3RlcyB0aGUgbWF0cml4IG9mIHN0YWNrZWQgJFhfaSckIHZhbHVlcyBmcm9tIHRoZSBkYXRhLiBUaGUgZXN0aW1hdG9yIGNhbiBiZSBkZXJpdmVkIGluIHRlcm1zIG9mIHRoZSBnZW5lcmFsaXplZCBtZXRob2Qgb2YgbW9tZW50cyAoR01NKS4KCkZvciB0aGUgcmVtYWluZGVyIG9mIHRoaXMgdGhlc2lzLCBhbGwgc3RhdGVtZW50cyBhbmQgZmlndXJlcyByZWdhcmRpbmcgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHdpbGwgYmUgcmVmZXJyaW5nIHRvIHRlc3RzIGNvbmR1Y3RlZCB3aXRoIGhldGVyb3NrZWRhc3RpY2l0eS1jb25zaXN0ZW50IChIQykgc3RhbmRhcmQgZXJyb3JzLiBBcyBzYW1wbGUgZXJyb3JzIGluIG15IG1vZGVscyB3aWxsIGhhdmUgZXF1YWwgdmFyaWFuY2UgYW5kIGFyZSB1bmNvcnJlbGF0ZWQsIHRoZSBsZWFzdC1zcXVhcmVzIGVzdGltYXRlcyBvZiBlYWNoIG1vZGVsJ3MgYmV0YSBjb2VmZmljaWVudHMgYXJlIHJlZ2FyZGVkIGFzIEJlc3QgTGluZWFyIFVuYmlhc2VkIEVzdGltYXRvcnMgKEJMVUVzKS4KCjxicj4KCiMjIyMjIDQuMS4zIEFjY291bnRpbmcgZm9yIE11bHRpY29saW5lYXJpdHkKTXVsdGljb2xpbmVhcml0eSBpcyBtZWFzdXJlZCB1c2luZyBWYXJpYW5jZSBJbmZsYXRpb24gRmFjdG9ycyAoVklGKS4gVGhlIFZJRiBvZiBhIHByZWRpY3RvciBtZWFzdXJlcyBob3cgYWNjdXJhdGVseSB0aGF0IHZhcmlhYmxlIGNhbiBiZSBwcmVkaWN0ZWQgdXNpbmcgYWxsIG90aGVyIHZhcmlhYmxlcy4gRm9yIGNvbnRleHQsIHRoZSBzcXVhcmUgcm9vdCBvZiBhIFZJRiByZXByZXNlbnRzIHRoZSBpbmNyZWFzZSBpbiBzdGFuZGFyZCBlcnJvciBvZiB0aGUgZXN0aW1hdGVkIGNvZWZmaWNpZW50IHdpdGggcmVzcGVjdCB0byB0aGUgY2FzZSB3aGVuIHRoYXQgZ2l2ZW4gdmFyaWFibGUgaXMgaW5kZXBlbmRlbnQgb2YgYWxsIG90aGVyIHZhcmlhYmxlcy4gSW5saW5lIHdpdGggY3VycmVudCBjb252ZW50aW9uLCBhbGwgdmFyaWFibGVzIHdpdGggYSBWSUYgbGFyZ2VyIHRoYW4gNSBhcmUgZWxpbWluYXRlZC4gQSBncmFwaGljYWwgcmVwcmVzZW50YXRpb24gb2YgYWxsIHZhcmlhYmxlIG11bHRpY29saW5lYXJpdHksIG1lYXN1cmVkIGJ5IFZJRiwgaXMgc2hvd24gaW4gaW1hZ2UgeC4KClRoaXMgdGVzdCByZXN1bHRlZCBpbiB0aGUgZWxpbWluYXRpb24gb2YgdGhlIHZhcmlhYmxlcyAqKipsaXN0X3ByaWNlKioqIGFuZCAqKiphcmVhX3RvdGFsKioqIGFuZCB0aGVyZSB3ZXJlIGhpZ2hseSBtdWx0aWNvbGluZWFyIHdpdGggKioqc29sZF9wcmljZSoqKiBhbmQgKioqYXJlYV9saXZpbmcqKiogcmVzcGVjdGl2ZWx5LgoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvTXVsdGlfY29saW4vTXVsdGlfY29fY29tYmluZWQucG5nKXt3aWR0aD04MCV9CjwvY2VudGVyPgoKPGJyPgoKIyMjIyMgNC4xLjQgQWNjb3VudGluZyBmb3IgTm9uLWxpbmVhcml0aWVzCkkgdmlzdWFsIGFuYWx5c2lzIHdhcyBjb25kdWN0ZWQgb24gYWxsIGNvbnRpbnVvdXMgdmFyaWFibGVzIGFuZCBub24tbGluZWFyIHZhcmlhYmxlcyB0cmFuc2Zvcm1hdGlvbiB3ZXJlIGFkZGVkIHRvICoqKmFnZSoqKiBhbmQgKioqYXJlYV9saXZpbmcqKioKCipBZ2U6KgoKQW4gYW5hbHlzaXMgb2YgYWdlIHZzLiBzb2xkIHByaWNlIHNob3dzIGEgd2VsbC1lc3RhYmxpc2hlZCB1LXNoYXBlZCBwYXR0ZXJuLiBJbiBvcmRlciB0byBhbGxvdyB0aGUgT0xTIG1vZGVsIHRvIGJldHRlciBjYXB0dXJlIHRoaXMgcmVsYXRpb25zaGlwLCBhIG5ldyB2YXJpYWJsZSAkYWdlXjIkIGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4gCgpJbWFnZSB4IHNob3dzIHRoZSBQYXJ0aWFsIERlcGVuZGVuY3kgUGxvdCAoUERQKSBvZiBhZ2Ugd2l0aGluIHRoZSBBbHBoYSBtb2RlbC4gVGhpcyBwbG90cyB0aGUgbWFyZ2luYWwgcHJlZGljdGlvbiBvZiB0aGUgQWxwaGEgbW9kZWwgYWNyb3NzIHRoZSBmdWxsIHJhbmdlIG9mIGFnZS4gV2hlbiB0aGUgc2NhbGUgb2YgdGhlIHktYXhpcyBpcyByZWR1Y2VkLCB3ZSBzZWUgdGhlIHNsaWdodCBjdXJ2YXR1cmUgaW4gQWxwaGEgbW9kZWwncyBlc3RpbWF0aW9uIG9mIGFnZSBlZmZlY3RzLiBUaGlzIGFkZGl0aW9uIGltcHJvdmVkICRSXjIkIGJ5ICQuMDgkLiAKCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L05vbmxpbmVhcml0aWVzL2FnZV9ub25fbGluX2NvbS5wbmcpe3dpZHRoPTEwMCV9CjwvY2VudGVyPgoKPGJyPgoKKkxpdmluZyBBcmVhOioKCkFuIGFuYWx5c2lzIG9mIGxpdmluZy1hcmVhIHZzLiBzb2xkIHByaWNlIHJldmVhbHMgYSBTaWdtb2lkIHBhdHRlcm4gYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcy4gSW4gb3JkZXIgdG8gYWxsb3cgdGhlIE9MUyBtb2RlbCB0byBiZXR0ZXIgY2FwdHVyZSB0aGlzIHJlbGF0aW9uc2hpcCwgYSBuZXcgdmFyaWFibGUgJGxpdmluZyBcIGFyZWFeMiQgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLiAKCkltYWdlIHggc2hvd3MgdGhlIFBhcnRpYWwgRGVwZW5kZW5jeSBQbG90IChQRFApIG9mICRsaXZpbmcgXCBhcmVhXjIkIHdpdGhpbiB0aGUgQWxwaGEgbW9kZWwuIFRoaXMgYWRkaXRpb24gaW1wcm92ZWQgJFJeMiQgYnkgJC4wNiQuCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9Ob25saW5lYXJpdGllcy9saXZpbmdfYXJlYV9ub25fbGluX2NvbS5wbmcpe3dpZHRoPTEwMCV9CjwvY2VudGVyPgoKPGJyPgoKIyMjIyMgNC4xLjUgQWNjb3VudGluZyBmb3IgSGlnaC1MZXZlcmFnZSBQb2ludHMgYW5kIE91dGxpZXJzCkFmdGVyIHRoZSBhZGp1c3RtZW50cyBvciB0aGUgcHJldmlvdXMgc2VjdGlvbnMgaGF2ZSBiZWVuIG1hZGUsIGEgcGFuZWwgb2YgdmlzdWFsaXphdGlvbnMgYXJlIHJ1biBvbiB0aGUgQWxwaGEgbW9kZWwuIFRoZSByZXN1bHRzIHNob3cgbm8gZXh0cmVtZSBvdXRsaWVycyBhbmQgb25seSBvbmUgaGlnaC1sZXZlcmFnZSBwb2ludCAob2JzICMyMzUxNSksIGFzIHNob3dzIGJ5IHRoZSByZXNpZHVhbCB2cy4gbGV2ZXJhZ2UgcGxvdCBpbiBxdWFkcmFudCB0d28gb2YgaW1hZ2UgWCwgd2hpY2ggaXMgcmVtb3ZlZCBpbiB0aGUgZmluYWwgQWxwaGEgbW9kZWwuIFRoZXNlIHJlc3VsdHMgYXJlIG1haW5seSBkdWUgdG8gdGhlIHByZXZpb3VzIHJlbW92YWwgb2Ygb3V0bGllcnMgaW4gwqczLjIgYW5kIHRoZSBvdmVyYWxsIHF1YWxpdHkgb2YgdGhlIGRhdGEgc2V0LiAKCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L2FscGhhX3Bsb3RzLnBuZyl7d2lkdGg9NzAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMjIDQuMS42IEZpbmFsIEFscGhhIE1vZGVsClVuZGVyIENvbnN0cnVjdGlvbgoKVGhlIEFscGhhIG1vZGVsIGlzIHRoZSBiYXNlbGluZSBPTFMgZm9yIHRoaXMgdGhlc2lzIGFuZCBpcyByZWJ1c3QgdG8gaGV0ZXJvc2thZGFzdGljaXR5LCBtdWx0aWNvbGluZWFyaXR5LCBub24tbGluZWFyaXRpZXMsIGhpZ2gtbGV2ZXJhZ2UgcG9pbnRzIGFuZCBvdXRsaWVycy4gVGhlc2UgaGlnaC1sZXZlbCBhZGp1c3RtZW50IGluY3JlYXNlIG91ciBjb25maWRlbmNlIGluIHRoZSBzdGF0aXN0aWNhbCB0ZXN0cyByZXN1bHRzIHdoaWNoIGZvbGxvdyAgCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9BbHBoYV9tb2RlbF9maW5hbC5wbmcpe3dpZHRoPTcwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIDQuMyBNb2RlbGluZyBDaGFuZ2VzIGluIERlbWFuZCBmb3IgSGVkb25pYyBGZWF0dXJlcwpUaGUgZm9jdXMgb2YgdGhpcyB0aGVzaXMgaXMgaG93IHRoZSBDb3ZpZCBjcmlzaXMgaW1wYWN0ZWQgaG91c2luZyBwcmljZXMgYW5kIHRoZSByZWxhdGl2ZSBsZXZlbHMgb2YgZGVtYW5kIGZvciBzcGVjaWZpYyBoZWRvbmljIGZlYXR1cmVzLiBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgSFBNIGlzIGluIHRoZSBPTFMgZnVuY3Rpb25hbCBmb3JtLCB0aGUgYmV0YSBjb2VmZmljaWVudHMgb2YgdGhpcyBtb2RlbCByZXByZXNlbnQgcmVsYXRpdmUgZGVtYW5kIGZvciBlYWNoIGFzc29jaWF0ZWQgaGVkb25pYyBmZWF0dXJlIFtAU2hpbWl6dV0uIEZvciBleGFtcGxlLCAkXGJldGFfe3Bvb2wgPSAxfSA9MTEsODU2JCBpcyBpbnRlcnByZXRlZCBhcyB0aGUgYXZlcmFnZSBjb25zdW1lcidzIHdpbGxpbmduZXNzIHRvIHBheSBmb3IgYW4gYXZlcmFnZSBwb29sLCBjZXRlcmlzIHBhcmFidXMuIEhvd2V2ZXIsIHRoaXMgdGhlc2lzIHdpc2hlcyB0byBtZWFzdXJlIHRoZSAqY2hhbmdlcyogaW4gdGhlIGF2ZXJhZ2UgY29uc3VtZXIncyB3aWxsaW5nbmVzcyB0byBwYXkgZm9yIGEgZ2l2ZW4gZmVhdHVyZSAoZS5nLiBwb29sKSBpbiByZWxhdGlvbnNoaXAgYSBtZWFzdXJlbWVudCBvZiBDb3ZpZCdzIGVjb25vbWljIGltcGFjdC4gCgojIyMjIyA0LjMuMSBDb21wYXJpc29uIE1ldGhvZApBIG1ldGhvZCBvZiBzdGF0aXN0aWNhbGx5IGNvbXBhcmluZyBjaGFuZ2VzIGluIHRoZSBiZXRhIGNvZWZmaWNpZW50cyBvZiBwYXJ0aWN1bGFyIGZlYXR1cmVzIG9mIGludGVyZXN0IHVuZGVyIG11bHRpcGxlIHNjZW5hcmlvcyAoZS5nLiBwb3N0IGFuZCBwcmUtY29yb25hIHBlcmlvZCkgaXMgbmVlZGVkLiBUbyBhY2NvbXBsaXNoIHRoaXMsIGEgbWV0aG9kIG91dGxpbmVkIGJ5IHRoZSBVQ0xBIFN0YXRpc3RpY3MgZGVwYXJ0bWVudCBpcyBpbXBsZW1lbnRlZCBbQEJydWluXS4gVGhlIGJlc3Qgd2F5IHRvIHVuZGVyc3RhbmQgdGhpcyBtZXRob2QgaXMgdG8gc2VlIGEgc2ltcGxlc3QgcmVwcm9kdWNpYmxlIGV4YW1wbGUuCgpTdXBwb3NlIHdlIHdhbnQgdG8gdGVzdCB0aGUgZWNvbm9taWMgaW1wYWN0IG9mIENvcm9uYSBvbiB0aGUgcmVsYXRpdmUgZGVtYW5kIGZvciBzd2ltbWluZyBwb29scywgJFxiZXRhX3twb29sID0gMX0kIGFuZCAkcG9vbCQgcmVzcGVjdGl2ZWx5LiBVc2luZyB0aGUgVUNMQSBtZXRob2QsIHdlIHRlc3QgdGhlIG51bGwgaHlwb3RoZXNpcyAkSF8wOlxiZXRhX3twb29sID0gMSxcIGNvcm9uYSA9IDB9ID0gXGJldGFfe3Bvb2wgPSAxLFwgY29yb25hID0gMX0kIHdpdGggdGhlIGZvbGxvd2luZyBPTFMKCjxicj4KCiQkCntzb2xkIFwgcHJpY2V9ID0gXGFscGhhIFwgKyBcYmV0YV8xIHtwb29sfSBcICsgXCAgXGJldGFfMiB7Y29yb25hfSBcICsgXGJldGFfMyB7KHBvb2wgXHRpbWVzIGNvcm9uYSl9CiQkCjxicj4KCldoaWNoIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZzoKCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1VDTEFfb3V0cHV0XzEucG5nKXt3aWR0aD01MCV9CjwvY2VudGVyPgoKPGJyPgoKVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgc2ltcGxpZmllZCBtb2RlbCdzIGVzdGltYXRlcyBhcmU6CgoqIEludGVyY2VwdDogSW50ZXJjZXB0IGZvciAkcG9vbCA9IDAkIAogICArIFRoZSBvbWl0ZWQgZ3JvdXAKKiBwb29sOiBTbG9wZSBmb3IgJHBvb2wgPSAxJAogICArIFRoZSBpbmNsdWRlZCBncm91cAoqIGluZmVjdGlvbnMgcGVyaW9kOiAkKCRJbnRlcmNlcHQgJGluZmVjdGlvbnMgXCBwZXJpb2QgPSAxKSQgJC0kICQoJGludGVyY2VwdCAkaW5mZWN0aW9ucyBcIHBlcmlvZCA9IDApJAogICArIFRoaXMgY2FuIGJlIHNlZW4gYnkgcnVubmluZyBpbmRpdmlkdWFsIHJlZ3Jlc3Npb25zIGZvciBlYWNoIGNhc2UKKiAocG9vbCppbmZlY3Rpb25zIHBlcmlvZCk6IFNsb3BlIGZvciAkcG9vbF97aW5mZWN0aW9ucyBcIHBlcmlvZCA9IDF9JCAkLSQgJHBvb2xfe2luZmVjdGlvbnMgXCBwZXJpb2QgPSAwfSQgCiAgICsgVGhpcyBlc3RpbWF0ZSB0ZXN0cyB0aGUgbnVsbCBoeXBvdGhlc2lzICRIXzA6IFxiZXRhX3twb29sID0gMSxcIGNvcm9uYSA9IDB9ID0gXGJldGFfe3Bvb2wgPSAxLFwgY29yb25hID0gMX0kCgo8YnI+CgpUaGVyZWZvcmUsIHdlIHNheToKCj4gVGhlIGF2ZXJhZ2UgcHJlbWl1bSBmb3IgYSBwcm9wZXJ0eSBoYXZpbmcgYSAqKnN3aW1taW5nIHBvb2wqKiBmZWxsIGJ5ICoqJDcsNzY2LjQwKiogd2hlbiBjb21wYXJlZCB0byBwcmUtY29yb25hIGxldmVscywgY2V0ZXJpcyBwYXJhYnVzLiBIb3dldmVyLCB0aGlzIGZpbmRpbmcgaXMgb25seSBzaWduaWZpY2FudCBhdCB0aGUgKioqcCA8IDAuMTAqKiogbGV2ZWwuICAKCjxicj4KCiMjIyMjIDQuMy4yIFNlbGVjdGluZyBhIENvcm9uYSBNZWFzdXJtZW50CkEgZ29vZCBtZWFzdXJlbWVudCB2YXJpYWJsZSBmb3IgbWVhc3VyaW5nIHRoZSByZXNwb25zZSBvZiB0aGUgbWFya2V0IHRvIHRoZSBjb3JvbmEgY3Jpc2lzIG11c3QgYmUgYSBjb3JvbmEtcmVsYXRlZCBtYXRyaWMgd2hpY2ggaXMgcHVibGljbHkgYXZhaWxhYmxlOyBjb21tb24ga25vd2xlZGdlIHRvIHRoZSBwb3B1bGF0aW9uIGFuZDsgaXMgYSByZWFzb25hYmxlIG1lYXN1cmVtZW50IG9mIGZ1dHVyZSBlY29ub21pYyBzaGlmdHMuIEZvciB0aGlzIHJlYXNvbiwgZGF0YSBjb2xsZWN0ZWQgZnJvbSB0aGUgTG91aXNpYW5hIERlcGFydG1lbnQgb2YgSGVhbHRoIFtATGFESF0gd2FzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSAzLW1vbnRoIG1vdmluZyBhdmVyYWdlIG9mIGNvcm9uYSBpbmZlY3Rpb25zIChpbmZlY3Rpb25zXzNtbWEpLgoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9Db3JvbmFfR2VuZXJhbC9XYXZlc19vZl9pbmZlY3Rpb24ucG5nKXt3aWR0aD03MCV9CjwvY2VudGVyPgoKPGJyPgoKVGhpcyBtZWFzdXJlbWVudCBmdWxmaWxscyB0aGUgcHJldmlvdXNseSBzdGF0ZWQgcmVxdWlyZW1lbnRzIG9mIGEgZ29vZCB0ZXN0IG1lYXN1cmVtZW50IGFzIGl0IGlzIHB1cmVseSByZWxhdGVkIHRvIHRoZSBjb3JvbmEgY3Jpc2lzLCBpcyBwdWJsaWNseSBhdmFpbGFibGUsIGlzIGFzc3VtZWQgdG8gYmUgcHVibGljbHkga25vd24gYXMgaXQgaXMgcmVwb3J0ZWQgYWNyb3NzIGFsbCBtYWpvciBuZXdzIHN0YXRpb25zIGRhaWx5LCBhbmQgcGVyaGFwcyBtb3N0IGltcG9ydGFudGx5LCBpcyB0aGUgcHJpbWFyeSBtZXRyaWMgdXNlZCB0byBkZWNpZGUgd2hlbiBtYW5kYXRvcnkgbG9ja2Rvd25zIGFyZSBpbnN0aXR1dGVkLiBGb3IgdGhpcyB0aGVzaXMsIGl0IGlzIGFzc3VtZSB0aGUgbWFya2V0IGlzIHJlc3BvbmRpbmcgdG8gc29tZSBsYWdnZWQgdmFsdWUgb2YgZGFpbHkgaW5mZWN0aW9ucyB3aGljaCBhcmUgYmVpbmcgdXNlZCBieSBjb25zdW1lcnMgdG8gZXN0aW1hdGUgdGhlIGxpa2VsaWhvb2Qgb2YgZnV0dXJlIGxvY2tkb3ducyBhbmQgdGhlIHN0cmluZ2VuY3ksIGFuZCBkdXJhdGlvbiBvZiBjdXJyZW50IGxvY2tkb3ducy4gV2l0aCB0aGlzIHJhdGlvbmFsLCBpbmZlY3Rpb25zXzNtbWEgaXMgc2VsZWN0ZWQgYXMgdGhlIHByaW1hcnkgbWVhc3VyZW1lbnQgb2YgY29yb25hJ3MgaW1wYWN0LiAKCjxicj48YnI+CgojIyMjIDQuNCBNYWNoaW5lIExlYXJuaW5nIAoKIyMjIyMgNC40LjEgTWFjaGluZSBMZWFybmluZyBNZXRob2RzCgpJbiB0aGUgcHJldmlvdXMgc3Vic2VjdGlvbiA0LjEsIGl0IHdhcyBzdGF0ZWQgdGhhdCB0aGUgbXVsdGl2YXJpYWJsZSByZWdyZXNzaW9uIG1vZGVscyBlc3RpbWF0ZSBhIHZlY3RvciBvZiBwYXJhbWV0ZXJzIChpLmUuIGJldGEgY29lZmZpY2llbnRzKSB0aGF0IGJlc3QgZml0IHRoZSBleHBsYW5hdG9yeSBoZWRvbmljIHZhcmlhYmxlcyB0byB0aGUgYXNzb2NpYXRlZCBkZXBlbmRlbnQgdmFyaWFibGUuIEludHVpdGl2ZWx5LCB0aGUgcmVzdWx0aW5nIGZpdHRlZCBjb2VmZmljaWVudCB2ZWN0b3IgaXMgZml0dGVkIHRvIHRoZSBlbnRpcmUgZGF0YSBzZXQsIGFuZCB0aGVyZWZvcmUsIHRoZSBsb3NzIGZ1bmN0aW9uIG1pbmltaXplcyB0aGUgZXJyb3IgaW4gdGhlIG1vZGVsJ3MgYWJpbGl0eSB0byAqZXhwbGFpbiogdGhlIHZlcnkgaW5kZXBlbmRlbnQgdmFyaWFibGUgaXQgd2FzIGZpdHRlZCB0by4gSW4gb3RoZXIgdGVybXMsIHRoZXNlIHJlc3VsdHMgYXJlIHVsdGltYXRlbHkgbGltaXRlZCB0byB0aGVpciBpbmZlcmVudGlhbCB2YWx1ZSB3aXRoaW4gdGhlIGV4YWN0IGNvbnRleHQgb2YgdGhlIGRhdGEgc2V0IHRoZSBtb2RlbCBpcyB0cmFpbmVkIG9uLiBJZiBvbmUgaXMgdG8gZXN0YWJsaXNoIGEgd2lkZXIsIG1vcmUgZ2VuZXJhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiBkZXBlbmRlbnQgYW5kIGluZGVwZW5kZW50IHZhcmlhYmxlcyB0aGF0IGdvIGJleW9uZCB0aGUgY29udGV4dCBvZiB0aGUgdHJhaW5lZCBkYXRhIHNldCwgc3VwZXJ2aXNlZCBtYWNoaW5lIGxlYXJuaW5nIChNTCkgcHJlZGljdGlvbiBtb2RlbHMgYXJlIGFuIGV4dHJlbWVseSBwb3dlcmZ1bCB0b29sIHRvIGRvIHNvLiBUaG91Z2ggdGhlIG1vZGVscyB1c2VkIGluIHRoaXMgdGhlc2lzIGRpZmZlciBhY3Jvc3Mgc2V2ZXJhbCBrZXkgcHJvY2Vzc2VzLCB0aGV5IGVhY2ggZ2VuZXJhbGx5IGZvbGxvdyBhIHNpbWlsYXIgbG9naWM6IAoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvTUxfUHJvY2Vzcy5wbmcpe3dpZHRoPTcwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA0LjQuMiBNb2RlbCBFdmFsdWF0aW9uIHdpdGggQ3Jvc3MtVmFsaWRhdGlvbgoKSW4gb3JkZXIgdG8gcmFuayBvcmRlciBtb2RlbHMsIHdlIHBlcmZvcm0gYSBwcm9jZXNzIGNhbGxlZCBDcm9zcy1WYWxpZGF0aW9uIChDVikuIEZpcnN0LCB0aGUgZnVsbCBkYXRhIHNldCBtdXN0IGJlIHNwbGl0IGludG8gJ3Rlc3QnIGFuZCAndHJhaW4nIChpLmUuIHZhbGlkYXRpb24pIHN1YnNldHMuIEVhY2ggTUwgbW9kZWwgd2lsbCBiZSBmaXR0ZWQgdG8gdGhlIHRyYWluIGRhdGEgc2V0IGFuZCBpdCdzIHBlcmZvcm1hbmNlIHdpbGwgYmUgZXZhbHVhdGVkIGJhc2VkIHRoZSBtb2RlbCdzIGFiaWxpdHkgdG8gcHJlZGljdGVkIG91dC1vZi1zYW1wbGUgb2JzZXJ2YXRpb25zIGluIHRoZSB0ZXN0ICh2YWxpZGF0aW9uKSBkYXRhIHNldC4gSW4gdGhpcyB3YXksIHRoZXNlIG1vZGVscyBhcmUgcmFua2VkIGJhc2VkIG9uIHRoZWlyIHRlc3QgbWVhbiBzcXVhcmVkIGVycm9ycyAoTVNFKS4gVGhpcyBwcm9jZXNzIGlzIG9mdGVuIHJlZmVycmVkIHRvIGFzIENyb3NzIFZhbGlkYXRpb24gKENWKS4gVGhlIHR3byBtb3N0IGNvbW1vbmx5IHVzZWQgQ1YgbWV0aG9kcyBhcmUgdGhlIFZhbGlkYXRpb24gU2V0IEFwcHJvYWNoIGFuZCBLLUZvbGQgQ3Jvc3MgVmFsaWRhdGlvbi4gCgpUaGUgVmFsaWRhdGlvbiBTZXQgQXBwcm9hY2ggKFZTQSkgaXMgdGhlIHNpbXBsZXN0IGNhc2Ugb2YgY3Jvc3MgdmFsaWRhdGlvbiBkYXRhIHNwbGl0dGluZyBhcyBpdCByYW5kb21seSBzcGxpdHMgdGhlIGVudGlyZSBkYXRhIHNldCBpbnRvIHRyYWluIGFuZCB0ZXN0IHN1YnNldHMgYmFzZWQgb24gYSBjZXJ0YWluIHBlcmNlbnRhZ2Ugc3BsaXQuIEZvciBleGFtcGxlLCB0aGUgcmVzZWFyY2hlciBjYW4gY2hvb3NlIHRvIHNwbGl0IHRoZSBkYXRhIHNldCB3aXRoIGEgODAlIHRyYWluaW5nIGFuZCAyMCUgdGVzdGluZyBzcGxpdC4gVGhlIGVzdGltYXRpb24gZm9yIHRoZSB0ZXN0IE1TRSBpcyBzaW1wbHkgdGhlIHRlc3QgZXJyb3IgYWdhaW5zdCB0aGUgdGVzdCBkYXRhIHNldC4KCjxicj4KCjxjZW50ZXI+ICpUZXN0IE1TRSBFc3RpbWF0aW9uIEVxdWF0aW9uKiA8L2NlbnRlcj4KCiQkQ1Zfe3ZzYX0gPSBNU0Vfe3ZzYX0kJAoKPGJyPgoKPGNlbnRlcj4KCiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1ZhbF9TZXRzLnBuZyl7d2lkdGg9NTAlfQo8L2NlbnRlcj4KCjxicj4KClRoZSBLLUZvbGQgQ1YgbWV0aG9kIGhhcyBpbmNyZWFzaW5nbHkgYmVlbiB1c2VkIGJ5IHJlc2VhcmNoZXMgYXMgaXQgb2ZmZXJzIGEgbW9yZSBjb21wcmVoZW5zaXZlIGNyb3NzIHZhbGlkYXRpb24gcHJvY2VzcyB3aGVuIGNvbXBhcmVkIHRvIG90aGVyIG1ldGhvZHMuIEstRm9sZCBDViBpcyB0aGUgcHJvY2VzcyBvZiByYW5kb21seSBzcGxpdHRpbmcgdGhlIGVudGlyZSBkYXRhIHNldCBpbnRvIGsgZ3JvdXBzLCBvciBmb2xkcywgZWFjaCB3aXRoIGFwcHJveGltYXRlbHkgYW4gZXF1YWwgbnVtYmVyIG9mIG9ic2VydmF0aW9ucy4gVGhlIGZpcnN0IGZvbGQgaXMgaGVsZCBvdXQgYW5kIHRoZSBtb2RlbCBpcyB0cmFpbmVkIG9uIHRoZSByZW1haW5pbmcgay0xIGZvbGRzLiBUaGlzIHByb2Nlc3MgaXMgcmVwZWF0ZWQgayB0aW1lcywgZWFjaCB0aW1lIGhvbGRpbmcgb3V0IGEgZGlmZmVyZW50IGZvbGQgdW50aWwgZXZlcnkgZm9sZCBoYXMgYmVlbiB0cmVhdGVkIGFzIHRoZSB2YWxpZGF0aW9uIHNldC4gRmluYWxseSwgdGhpcyB3aWxsIHJlc3VsdHMgaW4gayBlc3RpbWF0aW9ucyBvZiB0aGUgbW9kZWwncyB0ZXN0IGVycm9yIGFuZCB0aGUgZmluYWwgZXN0aW1hdGlvbiB3aWxsIGJlIHRoZSBhdmVyYWdlIGFjcm9zcyBhbGwgayBtb2RlbCBmaXRzLiAKCjxicj4KCjxjZW50ZXI+ICpUZXN0IE1TRSBFc3RpbWF0aW9uIEVxdWF0aW9uKiA8L2NlbnRlcj4KCiQkQ1Zfe2stZm9sZH0gPSBcZnJhY3sxfXtrfVxzdW1fe3Q9MX1ee2t9IE1TRV9pJCQKCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L0stRm9sZC5wbmcpe3dpZHRoPTUwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA0LjQuNCBNb2RlbCBTZWxlY3Rpb24gCkZvciB0aGlzIHRoZXNpcywgTUwgbW9kZWxzIHdpbGwgYmUgcmFua2VkIGJhc2VkIG9uIHR3byBmZWF0dXJlczogQWNjdXJhY3ksIGFzIG1lYXN1cmVkIGJ5IHRlc3QgTVNFLCBhbmQgaW50ZXJwcmV0YWJpbGl0eSwgcXVhbGl0YXRpdmVseSBkZWZpbmVkIGJ5IHRoZSBtb2RlbCdzIGFiaWxpdHkgdG8gcHJvdmlkZSBpbnNpZ2h0cyBpbnRvIHRvIHdoaWNoIGZlYXR1cmVzIGFyZSByZWxldmFudCB0byB0aGUgYWJpbGl0eSB0byBtYWtlIGNvcnJlY3QgcHJlZGljdGlvbnMsIGFuZCBieSBob3cgbXVjaCBhcmUgdGhleSByZWxldmFudC4KCipBY2N1cmFjeSoKClNpbmNlIGEgbWV0aG9kIG9mIG1vZGVsIGZpdHRpbmcgYW5kIGV2YWx1YXRpb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24gdGhyb3VnaCB0aGUgcHJvY2VzcyBvZiBDcm9zcyBWYWxpZGF0aW9uLCB3ZSBub3cgaGF2ZSBhIHdheSB0byByYW5rIGRpZmZlcmVudCBtb2RlbHMgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiB0aGVpciBhYmlsaXR5IHRvIGVzdGltYXRlIHRlc3QgTVNFLiBXaXRoIHRoaXMgZmVhdHVyZSwgaXQgaXMgcG9zc2libGUgdG8gY29tcGFyZSBzZXZlcmFsIG1vZGVscyB0byBvbmUgYW5vdGhlciBpbiB0ZXJtcyBvZiBlZmZlY3RpdmVuZXNzIGluIHByZWRpY3Rpb25zLiBGaXZlIGRpZmZlcmVudCBNTCBtb2RlbHMgd2VyZSBidWlsZCBmb3IgdGhpcyB0aGVzaXMgd2l0aCB0aGUgZm9sbG93aW5nIHJlc3VsdHM6Cgo8YnI+CgpgYGB7ciBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30KIyBDbGVhbmVkIERhdGEgU2V0IFN1bW1hcnkKZGYzIDwtIHN1cHByZXNzTWVzc2FnZXMocmVhZF9leGNlbCgiL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9UYWJsZXMvTUxfUmVzdWx0cy54bHN4IikpCgp0YWJsZTEgPC0gZ3QoZGYzKQp0YWJsZTEgPC0gdGFibGUxICU+JSB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIlZhcmlhYmxlIExpc3QiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IG1kKCIqU3RydWN0dXJlIGFuZCBzaG9ydCBkaXNjcmlwdGlvbioiKSkKCnRhYmxlMQpgYGAKCjxicj4KCipJbnRlcnByZXRhYmlsaXR5KgoKQSBtYWpvciBjcml0aWNpc20gb2YgTUwgbW9kZWxzIGFyZSB0aGVpciBsYWNrIG9mIGludGVycHJldGFiaWx0eSwgZXhwbGFpbmluZyAqaG93KiB0aGUgbW9kZWwgbWFrZXMgc3VjaCBhY2N1cmF0ZSBwcmVkaWN0aW9ucy4gQSBwcmltZSBleGFtcGxlIG9mIHRoaXMgY3JpdGlxdWUgY2FuIGJlIHNlZW4gaW4gQXJ0aWZpY2lhbCBOZXVyYWwgTmV0d29ya3MgKEFOTikgbWFjaGluZXMsIHdoaWNoIG9mdGVuIHVzZSBhIGxhcmdlIG51bWJlciBvZiBzbWFsbCBub2RlcyB0byBzZXF1ZW50aWFsbHkgZ2VuZXJhdGUgYSBzaW5nbGUgcHJlZGljdGlvbiB3aXRob3V0IGFueSBvbmUgb2YgdGhlc2Ugbm9kZXMgaG9sZGluZyBhIGNsZWFyIGludGVycHJldGF0aW9uIGFzIHRvIHdoaWNoIHZhcmlhYmxlcywgb3IgY29tYmluYXRpb24gb2YgdmFyaWFibGVzLCBsZWFkIHRvIGEgcGFydGljdWxhciBpbXByb3ZlbWVudCBpbiBwcmVkaWN0aW9uLiBIb3dldmVyLCBhcyBNTCBtZXRob2RzIGJlY29tZSBtb3JlIGNvbW1vbmx5IHVzZWQsIHRoZSBkZW1hbmQgZm9yIGludGVycHJldGF0aW9uIG9mIHRoZXNlIG1vZGVscyBoYXMgZHJpdmVuIHNldmVyYWwgdXNlZnVsIGludGVycHJldGF0aW9uIG1ldGhvZHMgYWNyb3NzIGZvciBhIHZhcmlldHkgb2YgbW9kZWxzLiBUaGVzZSBtZXRob2RzIGluY2x1ZGUgaW50ZXJwcmV0YXRpb24gZm9yIGEgc2luZ2xlIHByZWRpY3Rpb24sIHN1Y2ggYXMgdGhlIExvY2FsIEludGVycHJldGFibGUgTW9kZWwtYWdub3N0aWMgRXhwbGFuYXRpb25zIChMSU1FKSwgYXMgd2VsbCBhcyBnZW5lcmFsaXplZCBtZXRob2RzIG9mIG1lYXN1cmluZyByZWxhdGl2ZSBmZWF0dXJlIGltcG9ydGFuY2UsIHdoaWNoIHVzZXMgdmFyaW91cyB0ZWNobmlxdWVzIHRvIGRldGVybWluZSB0aGUgYXZlcmFnZSBjb250cmlidXRpb24gb2YgZWFjaCB2YXJpYWJsZSB0byB0aGUgbW9kZWwncyBhYmlsaXR5IHRvIGRlY3JlYXNlIGl0cyB0ZXN0IE1TRSByYXRlLiAKCgpPZiB0aGUgbW9kZWxzIHNhbXBsZWQsIHRoZSBlWHRyZW1lIEdyYWRpZW50IEJvb3N0aW5nIE1hY2hpbmUsIGFsc28gcmVmZXJyZWQgdG8gYXMgWEdCb29zdCwgb3V0cGVyZm9ybXMgdGhlIG90aGVyIG1vZGVscyBib3RoIGluIHRlcm1zIG9mIGhhdmluZyB0aGUgbG93ZXN0IHRlc3QgTVNFIGFuZCBoYXZpbmcgdGhlIGJlc3QgbWV0aG9kcyBmb3IgZGV0YWlsZWQgdmFyaWFibGUgaW50ZXJwcmV0YXRpb24uIEZvciB0aGlzIHJlYXNvbiwgWEdCb29zdCBpcyBjaG9zZW4gYXMgdGhlIHByaW1hcnkgTUwgbW9kZWwgZm9yIHRoaXMgdGhlc2lzIAoKCjxicj4KCiMjIyMjIDQuNC41IGVYdHJlbWUgR3JhZGllbnQgQm9vc3RpbmcgTWFjaGluZSBBbGdvcml0aG0KSW4gb3JkZXIgdG8gdW5kZXJzdGFuZCB0aGUgbG9naWMgb2YgWEdCb29zdCwgb25lIG11c3QgZmlyc3QgbG9vayBhdCB0aGUgY29tcGFjdCwgeWV0IHBvd2VyZnVsIGFsZ29yaXRobSBiZWhpbmQgaXRzIGNvbXB1dGF0aW9uLiBJbiB0aGlzIHNlY3Rpb24sIEkgd2lsbCBsYXkgb3V0IHRoZSBtYXRoZW1hdGljYWwgZm9ybXVsYXRpb24gb2YgdGhlIGlucHV0LCBjb3JlIGFsZ29yaXRobSwgYW5kIGZpbmFsIG91dHB1dCBvZiB0aGUgWEdCb29zdCBtYWNoaW5lLgoKPGJyPgoKMS4gQWxnb3JpdGhtIGlucHV0OiBXZSBzdGFydCB3aXRoIGEgdHJhaW5pbmcgc2V0ICR7XGRpc3BsYXlzdHlsZSBceyh4X3tpfSx5X3tpfSlcfV97aT0xfV57Tn19JCwgYSBkaWZmZXJlbnRpYWJsZSBsb3NzIGZ1bmN0aW9uICRMKHksIEYoeCkpJCwgYSBudW1iZXIgb2Ygd2VhayBsZWFybmVycyAoc2hhbGxvdyB0cmVlcykgJE0kLCBhbmQgYSBsZWFybmluZyByYXRlICRcYWxwaGEkLgoKCjIuIEFsZ29yaXRobToKCjIuMSBJbml0aWFsaXplIG1vZGVsIHdpdGggYSBjb25zdGFudCB2YWx1ZToKCiQke1xkaXNwbGF5c3R5bGUge1xoYXQge2Z9fV97KDApfSh4KT17XHVuZGVyc2V0IHtcdGhldGEgfXtcYXJnIFxtaW4gfX1cc3VtIF97aT0xfV57Tn1MKHlfe2l9LFx0aGV0YSApfSQkCgo8YnI+CgoyLjIgRm9yICRtID0gMSQgdG8gJE0kOgoKMi4yLjEgQ29tcHV0ZSB0aGUgJ2dyYWRpZW50cycgYW5kICdoZXNzaWFucwokJHtcZGlzcGxheXN0eWxlIHtcaGF0IHtnfX1fe219KHhfe2l9KT1cbGVmdFt7XGZyYWMge1xwYXJ0aWFsIEwoeV97aX0sZih4X3tpfSkpfXtccGFydGlhbCBmKHhfe2l9KX19XHJpZ2h0XV97Zih4KT17XGhhdCB7Zn19X3sobS0xKX0oeCl9fSQkCiQke1xkaXNwbGF5c3R5bGUge1xoYXQge2h9fV97bX0oeF97aX0pPVxsZWZ0W3tcZnJhYyB7XHBhcnRpYWwgXnsyfUwoeV97aX0sZih4X3tpfSkpfXtccGFydGlhbCBmKHhfe2l9KV57Mn19fVxyaWdodF1fe2YoeCk9e1xoYXQge2Z9fV97KG0tMSl9KHgpfX0kJAoKPGJyPgoKMi4yLjIgRml0IGFuIG9yaWdpbmFsIHdlYWsgbGVhcm5lciAoZS5nLiBzaGFsbG93IHRyZWUpIHVzaW5nIHRoZSB0cmFpbmluZyBzZXQgJHtcZGlzcGxheXN0eWxlIFxkaXNwbGF5c3R5bGUgXHt4X3tpfSwte1xmcmFjIHt7XGhhdCB7Z319X3ttfSh4X3tpfSl9e3tcaGF0IHtofX1fe219KHhfe2l9KX19XH1fe2k9MX1ee059fSQgYnkgc29sdmluZyB0aGUgZm9sbG93aW5nIG9wdGltaXphdGlvbiBwcm9ibGVtOgoKJCR7XGRpc3BsYXlzdHlsZSB7XGhhdCB7XHBoaSB9fV97bX09e1x1bmRlcnNldCB7XHBoaSBcaW4gXG1hdGhiZiB7XFBoaSB9IH17XGFyZyBcbWluIH19XHN1bSBfe2k9MX1ee059e1xmcmFjIHsxfXsyfX17XGhhdCB7aH19X3ttfSh4X3tpfSlcbGVmdFste1xmcmFjIHt7XGhhdCB7Z319X3ttfSh4X3tpfSl9e3tcaGF0IHtofX1fe219KHhfe2l9KX19LVxwaGkgKHhfe2l9KVxyaWdodF1eezJ9fSQkCgokJHtcZGlzcGxheXN0eWxlIHtcaGF0IHtmfX1fe219KHgpPVxhbHBoYSB7XGhhdCB7XHBoaSB9fV97bX0oeCkufSQkCgo8YnI+CgoyLjMgVXBkYXRlIHRoZSBtb2RlbDoKJCR7XGRpc3BsYXlzdHlsZSB7XGhhdCB7Zn19X3sobSl9KHgpPXtcaGF0IHtmfX1feyhtLTEpfSh4KSt7XGhhdCB7Zn19X3ttfSh4KS59JCQKCjxicj4KCjMuIEFsZ29yaXRobSBPdXRwdXQ6IAokJHtcZGlzcGxheXN0eWxlIHtcaGF0IHtmfX0oeCk9e1xoYXQge2Z9fV97KE0pfSh4KT1cc3VtIF97bT0wfV57TX17XGhhdCB7Zn19X3ttfSh4KX0kJAoKPGJyPgoKIyMjIyMgNC40LjYgWEdCb29zdCBNb2RlbCBGaXR0aW5nIGFuZCBIeXBlcnBhcmFtZXRlciBUdW5pbmcKSW4gcHJhY3RpY2UsIHdoZW4gYXR0ZW1wdGluZyB0byBwcm9kdWNlIHRoZSBtb3N0IG9wdGltYWwgcmVzdWx0cyBmcm9tIGFuIFhHQm9vc3QgbWFjaGluZSwgYXMgaXMgdHJ1ZSB3aXRoIG1vc3Qgb3RoZXIgTUwgbW9kZWxzLCBvbmUgbXVzdCBmaXJzdCB0cmFuc2Zvcm0gdGhlIGRhdGEgc2V0IGludG8gYW4gb3B0aW1hbCBmb3JtIGFuZCB0aGVuIHJ1biBzZXQgb2YgaHlwZXJwYXJhbWV0ZXIgdGVzdHMgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBsZXZlbCBmb3IgZWFjaCBvZiB0aGUgbW9kZWwncyBiYXNpYyBzdHJ1Y3R1cmFsIHJ1bGVzIChpLmUuIGh5cGVycGFyYW1ldGVycykuCgpTaW5jZSB0aGUgWEdCb29zdCBtYWNoaW5lIHJlcXVpcmVzIG9ubHkgbnVtZXJpY2FsIGRhdGEsIGZhY3RvciBkYXRhIG11c3QgYmUgY29udmVydGVkIGludG8gbnVtZXJpY2FsIGxldmVscyB3aGljaCBjYW4gYmUgdGhlIHVzZWQgaW4gdGhlIGNvbnN0cnVjdGlvbiBvZiBkZWNpc2lvbiB0cmVlcy4gVG8gYWNjb21wbGlzaCB0aGlzIHdpdGggdGhlIGFkZGVkIGNvbXBsZXhpdHkgb2Ygc29tZSBmYWN0b3IgdmFyaWFibGVzIGhhdmluZyBtb3JlIHRoYW4gdHdvIGxldmVscywgSSBoYXZlIHVzZWQgYSBtZXRob2QgY2FsbGVkICpPbmUtSG90IEVuY29kaW5nKiwgd2hpY2ggZW5jb2RlcyBlYWNoIGluZGl2aWR1YWwgZmFjdG9yIHZhcmlhYmxlIGxldmVsIGludG8gYSB2ZWN0b3IgY29udGFpbmluZyAnMScgaWYgdGhhdCBmYWN0b3IgYW5kIGxldmVsIGFyZSBwcmVzZW50LCBhbmQgJzAnIGlmIGl0IGlzIG5vdC4gSW4gdGhpcyB3YXksIHRoZSBkYXRhZnJhbWUgaXMgY29udmVydGVkIGludG8gYSBsYXJnZSBtYXRyaXggb2YgY29udGludW91cyBhbmQgYmluYXJ5IGNvbHVtbnMuCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9PbmUtSG90X0VuY29kaW5nLnBuZyl7d2lkdGg9OTAlfQo8L2NlbnRlcj4KCjxicj4KCk9uY2UgdGhlIG1vZGVsIGlzIGZpdHRlZCB0byB0aGUgZGF0YSwgdGhlIG5leHQgcHJvY2VkdXJlIGlzIHRvIHR1bmUgdGhlIGh5cGVycGFyYW1ldGVycyB3aGljaCBnb3Zlcm4gdGhlIGFsZ29yaXRobSdzIGxlYXJuaW5nIHByb2Nlc3MgYW5kIHRoZXJlZm9yZSBkZXRlcm1pbmUgdGhlIHJlc3VsdGluZyB2YWx1ZXMgb2YgZXN0aW1hdGVkIHBhcmFtZXRlcnMuIFRvIGRvIHRoaXMsIGEgbGFyZ2UgZ3JpZCBvZiBoeXBlcnBhcmFtZXRlcnMgaXMgY3JlYXRlZCBhbmQgdGhlbiBhbiBpbmRpdmlkdWFsIG1vZGVsIGNvbnRhaW5pbmcgZWFjaCB1bmlxdWUgY29tYmluYXRpb24gb2YgaHlwZXJwYXJhbWV0ZXIgbGV2ZWxzIGlzIGdlbmVyYXRlZCBhbmQgdGhlaXIgcmVzdWx0aW5nIHRlc3QgTVNFJ3MgYXJlIHJhbmtlZCBhbmQgYW5hbHl6ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBsYXJnZSBncmlkIHNlYXJjaCBkZXRlcm1pbmUgd2hpY2ggY29tYmluYXRpb24gb2YgaHlwZXJwYXJhbWV0ZXJzIGFyZSBvcHRpbWFsLCBhbmQgdGhvc2UgaHlwZXJwYXJhbWV0ZXJzIGFyZSB1c2VkIGluIHRoZSBmaW5hbCBtb2RlbC4gVGhlIHNlYXJjaCBncmlkIGZyb20gdGhpcyByZXNlYXJjaCB3YXMgc28gbGFyZ2UsIGl0IHRvb2sgbXkgY29tcHV0ZXIgKjc4IGhvdXJzKiB0byBjb21wbGV0ZSBhbGwgb2YgdGhlIGNhbGN1bGF0aW9uIG5lY2Vzc2FyeSBmb3IgdGhlIGZ1bGwgdHVuaW5nIHByb2Nlc3MuCgo8YnI+CgojIyMjIyA0LjQuNyBYR0Jvb3N0IFBhcnRpYWwgRGVwZW5kZW5jeSBQbG90cwoKUGFydGlhbCBkZXBlbmRlbmN5IHBsb3RzIChQRFApIHNob3dzIHJlbGF0aW9uc2hpcCwgb3IgZGVwZW5kZW5jZSwgYmV0d2VlbiB0aGUgbW9kZWwncyByZXNwb25zZSB2YXJpYWJsZSAoaS5lLiAkc29sZCBcIHByaWNlJCkgYW5kIGEgY2hvc2VuIHZhcmlhYmxlLCBvciBzZXQgb2YgdmFyaWFibGVzLCBvZiBpbnRlcmVzdHMgKFZvSSksIHJlc3VsdGluZyBpbiB0aGUgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgdmFyaWFibGVzIG1hcmdpbmFsIGNvbnRyaWJ1dGlvbiB0byB0aGUgbWFjaGluZSdzIHByZWRpY3Rpb24gYWNyb3NzIHRoZSB2YXJpYWJsZSBvZiBpbnRlcmVzdCdzIGVudGlyZSByYW5nZS4gSW4gb3JkZXIgdG8gYW5hbHl6ZSB0aGUgcmVzdWx0cyBvZiB0aGUgWEdCb29zdCBtYWNoaW5lIGF0IHRoZSB2YXJpYWJsZS1ieS12YXJpYWJsZSBsZXZlbCwgSSBoYXZlIGdlbmVyYXRlIGEgcGFuZWwgb2YgZm91ciBncmFwaGljYWwgcGFydGlhbCBkZXBlbmRlbmN5IHBsb3RzIGZvciBlYWNoIHZhcmlhYmxlIG9mIGludGVyZXN0LiBUaGVzaXMgd2lsbCBiZSB0aGUgZm9sbG93aW5nOiBCYXNpYyBQRFAgcGxvdCwgSW5kaXZpZHVhbCBDb25kaXRpb25hbCBFeHBlY3RhdGlvbiAoSUNFKSBwbG90cywgUERQIGhlYXRtYXAgd2l0aCBWb0kgYWdhaW5zdCBjb3JvbmEgaW5mZWN0aW9uLCAzLWRpbWVuc2lvbmFsIFBEUCBoZWF0bWFwIHdpdGggVm9JIGFnYWluc3QgY29yb25hIGluZmVjdGlvbi4gCgpJbWFnZSBYWCBzaG93cyBhbiBleGFtcGxlIG9mIGVhY2ggZ3JhcGggCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9QRFBfRXhhbXBsZV9Db21iaW5lZC5wbmcpe3dpZHRoPTk5JX0KPC9jZW50ZXI+Cgo8YnI+Cgo8YnI+PGJyPgoKIyMjIDUuIEh5cG90aGVzaXMgQ29uc3RydWN0aW9uCgojIyMjIDUuMSBDb3ZpZC0xOTogR2VuZXJhbCBDYXNlCj4gKipIeXBvdGhlc2lzIEk6KiogVGhlIENvdmlkLTE5IGNyaXNpcyBzaWduaWZpY2FudGx5IGluY3JlYXNlZCBob3VzaW5nIHByaWNlcwo+Cj4gKipSZWFzb25pbmc6KiogQXMgbWFueSB3b3JrZXJzIGhhdmUgcGVybWluYW50bHkgc2hpZnRlZCB0byByZW1vdGUgd29yaywgdGhlIHRvdGFsIHV0aWxpdHkgb2YgcmVzaWRlbnRpYWwgaG91c2luZyBoYXMgaW5jcmVhc2VkLCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlIHByaWNlIGhvdXNlaG9sZHMgYXJlIHdpbGxpbmcgdG8gcGF5LiBUaGlzIHByaWNlIHNoaWZ0IGNhbiBiZSBleHBsYWluZWQgdGhyb3VnaCBtZWFzdXJpbmcgdGhlIGNoYW5nZXMgaWYgcmVsYXRpdmUgZGVtYW5kIGZvciBzcGVjaWZpYyBoZWRvbmljIGZlYXR1cmVzLCBzdWNoIGFzIGJlZHJvb21zLCBzaXplLCBhZ2UsIGFuZCBvdGhlcnMuIAoKPGJyPgoKIyMjIyA1LjIgQ292aWQtMTk6IFByZW1pdW0gZm9yIEJlZHJvb21zCj4gKipIeXBvdGhlc2lzIElJOioqIFRoZSBDb3ZpZC0xOSBjcmlzaXMgc2lnbmlmaWNhbnRseSBpbmNyZWFzZWQgZGVtYW5kLXByZW1pdW1zIGZvciBldmVyeSBsZXZlbCBvZiBiZWRyb29tcyAKPgo+ICoqUmVhc29uaW5nOioqIEFzIG1hbnkgd29ya2VycyBoYXZlIHBlcm1pbmFudGx5IHNoaWZ0ZWQgdG8gcmVtb3RlIHdvcmssIHRoZSBwcmVtaXVtIGZvciBhbiBhZGRpdGlvbmFsIGJlZHJvb20gaXMgZXhwZWN0ZWQgdG8gaW5jcmVhc2UgYWNyb3NzIGVhY2ggbGV2ZWwgb2YgdG90YWxfYmVkcyBhcyBob3VzZWhvbGRzIG5lZWQgYWRkaXRpb25hbCByb29tcyBmb3IgaG9tZW9mZmljZXMgYW5kIG90aGVyIGFjdGl2aXRpZXMuICAKCjxicj4KCiMjIyMgNS4zIENvdmlkLTE5OiBQcmVtaXVtIGZvciBDaXR5IENlbnRyYWxpdHkKPiAqKkh5cG90aGVzaXMgSUlJOioqIFRoZSBDb3ZpZC0xOSBjcmlzaXMgaW1wYWN0ZWQgcHJvcGVydGllcyB3aXRoaW4gY2l0eSBsaW1pdHMgbW9yZSB0aGFuIHRob3NlIG5vdCB3aXRoaW4gY2l0eSBsaW1pdHMgIAo+Cj4gKipSZWFzb25pbmc6KiogQXMgd29ya2VycyB3aG8gbGl2ZSBpbiBjaXR5IGxpbWl0cyBoYXZlIGpvYnMgbW9yZSBsaWtlbHkgdG8gYmUgY29tcGF0ZWJsZSB3aXRoIHJlbW90ZSB3b3JrLCBzdWNoIGFzIGpvYnMgd2l0aGluIHRoZSBmaW5hbmNpYWwgaW5kdXN0cnksIGhvbWUgcHJpY2VzIHdpdGhpbiBjaXR5IGxpbWl0cyBhcmUgZGlzcHJvcG9yc2lvbmF0bHkgaW1wYWN0ZWQgYnkgdGhlIHNoaWZ0IHRvIHJlbW90ZSB3b3JrLgoKPGJyPgoKIyMjIyA1LjQgQ292aWQtMTk6IFByZW1pdW0gZm9yIFJlbGF0aXZlIFByaWNlIExldmVscyAKPiAqKkh5cG90aGVzaXMgSVY6KiogVGhlIENvdmlkLTE5IGNyaXNpcyBpbXBhY3RlZCBwcm9wZXJ0aWVzIGluIHRoZSB0b3AgMjV0aCBwZXJjZW50aWxlIG9mIHByaWNlIG1vcmUgdGhhbiB0aGUgYm90dG9tIDI1dGggcGVyY2VudGlsZSAKPgo+ICoqUmVhc29uaW5nOioqIEhvdXNlaG9sZHMgd2hvIGxpdmUgaW4gdGhlIHRvcCAyNXRoIHBlcmNlbnRpbGUgb2YgaG9tZSBwcmljZXMgYXJlIG1vcmUgbGlrZWx5IHRvIGhvbGQgd2hpdGUtY29sbGFyIGpvYnMsIHdoaWNoIGFyZSBtb3JlIGxpa2VseSB0byBiZSBtYWRlIHJlbW90ZSwgd2hpY2ggaW5jcmVhc2VzIHRoZSBwcmVtaXVtIHdpbGxpbmcgdG8gcGF5IGZvciBhZGRpdG9uYWwgaGVkb25pYyBmZWF0dXJlcy4gIAoKPGJyPgoKIyMjIyA1LjUgQ292aWQtMTk6IFByZW1pdW0gZm9yIFNpemUKCj4gKipIeXBvdGhlc2lzIFY6KiogVGhlIENvdmlkLTE5IGNyaXNpcyBpbmNyZWFzZWQgdGhlIHByZW1pdW0gZm9yIHByb3BlcnR5IHNpemUgCj4KPiAqKlJlYXNvbmluZzoqKiBTYW1lIGFzIGZvciBoeXBvdGhlc2lzIEkKCjxicj4KCj4gKipIeXBvdGhlc2lzIFZJOioqIFRoZSBDb3ZpZC0xOSBjcmlzaXMgaW1wYWN0ZWQgcHJvcGVydGllcyBpbiB0aGUgdG9wIDI1dGggcGVyY2VudGlsZSBvZiBwcmljZSBtb3JlIHRoYW4gdGhlIGJvdHRvbSAyNXRoIHBlcmNlbnRpbGUgCj4KPiAqKlJlYXNvbmluZzoqKiBIb3VzZWhvbGRzIHdobyBsaXZlIGluIHRoZSB0b3AgMjV0aCBwZXJjZW50aWxlIG9mIGhvbWUgc2l6ZXMgYXJlIG1vcmUgbGlrZWx5IHRvIGhvbGQgd2hpdGUtY29sbGFyIGpvYnMsIHdoaWNoIGFyZSBtb3JlIGxpa2VseSB0byBiZSBtYWRlIHJlbW90ZSwgd2hpY2ggaW5jcmVhc2VzIHRoZSBwcmVtaXVtIHRoZXkgYXJlIHdpbGxpbmcgdG8gcGF5IGZvciBhZGRpdG9uYWwgaGVkb25pYyBmZWF0dXJlcy4KCjxicj4KCiMjIyMgNS42IENvdmlkLTE5OiBQcmVtaXVtIGZvciBBZ2UgCgo+ICoqSHlwb3RoZXNpcyBWSUk6KiogVGhlIENvdmlkLTE5IGNyaXNpcyBpbmNyZWFzZWQgdGhlIHByZW1pdW0gZm9yIHByb3BlcnR5IGFnZSAKPgo+ICoqUmVhc29uaW5nOioqIEFzIHRoZSB2b2xvY2l0eSBvZiBob21lIHNhbGVzIGluY3JlYXNlLCB0aGUgZ2VuZXJhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiBwcm9wZXJ0eSBhZ2UgYW5kIHByaWNlIGlzIGV4cGVjdGVkIHRvIGJlIGV4YXN0ZXJiYXRlZCBhcyB0aG9zZSB1cGdyYWRpbmcgaG91c2VzIHdpbGwgc2hpdCB0b3dhcmRzIG5ld2VyIHByb3BlcnRpZXMKCjxicj4KCj4gKipIeXBvdGhlc2lzIFZJSUk6KiogVGhlIENvdmlkLTE5IGNyaXNpcyBpbXBhY3RlZCBwcm9wZXJ0aWVzIGluIHRoZSB0b3AgMjV0aCBwZXJjZW50aWxlIG9mIGFnZSBtb3JlIHRoYW4gdGhlIGJvdHRvbSAyNXRoIHBlcmNlbnRpbGUgIAo+Cj4gKipSZWFzb25pbmc6KiogVGhlIHByZW1pdW0gZm9yIHRoZSB5b3VuZ2VzdCAoaS5lLiBuZXdlc3QpIHByb3BlcnRpZXMgaXMgZXhwZWN0ZWQgdG8gaW5jcmVhc2Ugd2hpbGUgdGhlIHByZW1pdW0gZm9yIHRoZSBvbGRlc3QgcHJvcGVydGllcyBpcyBleHBlY3RlZCB0byBkZWNyZWFzZS4gQXMgdGhlIG1hcmtldCBzaGlmdHMgdG93YXJkcyBuZXdlciBwcm9wZXJ0aWVzLCB0aGV5IG11c3QgbmVjaXNzYXJpbHkgc2hpZnQgYXdheSBmcm9tIG9sZGVyIHByb3BlcnRpZXMuCgo8YnI+CgojIyMjIDUuNyBDb3ZpZC0xOTogQ2hhbmdlIGluIERheXMgb24gTWFya2V0Cgo+ICoqSHlwb3RoZXNpcyBJWDoqKiBUaGUgQ292aWQtMTkgY3Jpc2lzIHNpZ25pZmljYW50bHkgaW1wYWN0ZWQgdGhlIHByZW1pdW0gZm9yIGRheXMgb24gbWFya2V0IAo+Cj4gKipSZWFzb25pbmc6KiogQXMgdGhlIHZvbG9jaXR5IG9mIGhvbWUgc2FsZXMgaW5jcmVhc2UsIG1vcmUgaG9tZXMgYXJlIHNvbGQgZmFzdGVyLCBhbmQgdGhlcmVmb3JlIHRoZSBudW1iZXIgb2YgZGF5cyBvbiB0aGUgbWFya2V0IGJlY29tZXMgbGVzcyBvZiBhIHByZWRpY3RvciBvZiBxdWFsaXR5IHNpbmNlIGV2ZW4gbG93ZXIgcXVhbGl0eSBhbmQgb3Zlci1wcmljZWQgaG9tZXMgYXJlIHNvbGQgbW9yZSBxdWlja2x5LiAKCjxicj4KCj4gKipIeXBvdGhlc2lzIFg6KiogVGhlIENvdmlkLTE5IGNyaXNpcyBpbXBhY3RlZCBwcm9wZXJ0aWVzIGluIHRoZSB0b3AgMjV0aCBwZXJjZW50aWxlIG9mIGRheXMgb24gbWFya2V0IG1vcmUgdGhhbiB0aGUgYm90dG9tIDI1dGggcGVyY2VudGlsZSAKPgo+ICoqUmVhc29uaW5nOioqIFRoZSBwcmVtaXVtIGZvciBhIHByb3BlcnR5IGJlaW5nIHNvbGQgd2l0aGluIHRoZSB0b3AgMjV0aCBwZXJjZW50aWxlIG9mIGRheXMgb24gbWFya2V0IChET00pLCBpLmUuIHRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNpdCBvbiB0aGUgbWFya2V0IHRoZSBsb2dlc3QsIGlzIGV4cGVjdGVkIHRvIGJlIGRpc3Byb3BvcnRpb25hdGVseSBlZmZlY3RlZCB3aGVuIGNvbXBhcmVkIGhvbWVzIHdoaWNoIHNvbGQgdGhlIGZhc3Rlc3QsIGFzIGhvdXNlaG9sZHMgZWxhc3RpY2l0eSBvZiBkZW1hbmQgZm9yIHNwZWNpZmljIGNoYXJhY3RlcmlzdGljcyBkZWNyZXNlcyByZWxhdGl2ZSB0byBwcmljZSwgaXQgd2lsbCB0YWtlIGxhcmdlciBkZXZpYXRpb24gaW4gcHJpY2UgYW5kIHF1YWxpdHkgdG8gbWFrZSBhIGhvbWUgc2VsbCBpbiB0aGUgdG9wIDI1dGggcGVyY2VudGlsZSBvZiBET00gCgoKCjxicj48YnI+CgojIyMgNi4gUmVzdWx0cwpUaGlzIHNlY3Rpb24gd2lsbCBmb2xsb3cgYSBjbGVhciBhbmQgY29uc2lzdGVudCBzdHJ1Y3R1cmUgZm9yIGVhY2ggc3Vic2VjdGlvbiBvZiByZXN1bHRzLiBFYWNoIGh5cG90aGVzaXMgd2lsbCBoYXZlOiBBICpnZW5lcmFsIG92ZXJ2aWV3KiBvZiB0aGUgY2hhcmFjdGVyaXN0aWMgYmVpbmcgbW9kZWxlZCBhbmQ7ICptb2RlbCByZXN1bHRzKiB3aXRoIHN0YW5kYXJkIGh5cG90aGVzaXMgY29uY2x1c2lvbihzKS4gCgo8YnI+CgojIyMjIDYuMSBDb3ZpZC0xOTogR2VuZXJhbCBDYXNlCiMjIyMjIDYuMS4xIFN1bW1hcnkgb2YgRmluZGluZ3MKPiBQcmVsaW1pbmFyeSBhbmFseXNpcyBvZiBob3VzaW5nIHByaWNlcyBhbmQgZGFpbHkgaW5mZWN0aW9ucyByZXZlYWxzIGEgcG9zaXRpdmUgaGlzdG9yaWNhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSB0d28ga2V5IHZhcmlhYmxlcy4gVGhpcyByZWxhdGlvbnNoaXAgaXMgc3Ryb25nbHkgc3VwcG9ydGVkIGJ5IHRoZSBYR0Jvb3N0IE1MIGFsZ29yaXRobSwgd2hpY2ggc2hvd3MgdGhhdCBhIG1heGltYWwgcmVkdWN0aW9uIGluIHByZWRpY3Rpb25zIGVycm9yIGlzIGFjaGVpdmVkIGJ5IGluY3JlYXNpbmcgdGhlIHByZWRpY2l0b24gcHJpY2UgYXQgYWxsIGxldmVscyBvZiBkYWlseSBpbmZlY3Rpb25zID4gMCwgaG9sZGluZyBhbGwgb3RoZXIgZmFjdG9ycyBjb25zdGFudC4gWEdCb29zdCBkZXRlcm1pbmVzIHRoYXQgZnJvbSB0aGUgMTA0IHRvdGFsIHZhcmlhYmxlcywgZGFpbHkgaW5mZWN0aW9ucyBpcyB0aGUgMTl0aCBtb3N0IGltcG9ydGFudCB2YXJpYWJsZSBpbiByZWR1Y2luZyBwcmljZSBwcmVkaWN0aW9uIGVycm9yLiAgCj4KPiBGdXJ0aGVybW9yZSwgaW4gdGhlIGZ1bGx5IGNvbnRyb2xsZWQgQWxwaGEgbW9kZWwsIHRoZSBiZXRhIGNvZWZmaWNpZW50IGZvciBkYWlseSBpbmZlY3Rpb25zIHN1Z2dlc3RzIHRoYXQgZWFjaCBhZGRpdGlvbmFsIGluZmVjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYW4gYXZlcmFnZSBob21lIHByaWNlICppbmNyZWFzZSBvZiAkOC45NyosIGNldGVyaXMgcGFyYWJ1cy4gVGhpcyBmaW5kaW5nIGlzIHNpZ25pZmljYW50IGF0IHRoZSAqcCA8IDAuMDAqIGxldmVsLiAgCgojIyMjIyA2LjEuMiBWaXN1YWwgUmV2aWV3CldlIGZpcnN0IGxvb2sgYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkYWlseSBpbmZlY3Rpb25zIGFuZCB0aGUgYWNjdW11bGF0aW9uIG9mIGluZmVjdGlvbnMgYWNyb3NzIHRpbWUuIFRoZSB2YXJpYXRpb24gaW4gaGlzdG9yaWNhbCBkYWlseSBpbmZlY3Rpb25zIHNob3VsZCBwcm92aWRlIGEgc3Ryb25nIG1lYXN1cmVtZW50IGZvciBleHBsYWluaW5nIHZhcmlhdGlvbnMgaW4gcHJpY2UgcmVsYXRlZCB0byB0aGlzIGtleSB2YXJpYWJsZS4gCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0Nvcm9uYV9HZW5lcmFsL0luZmVjdGlvbnNfY29tYmluZWQucG5nKXt3aWR0aD05OSV9CjwvY2VudGVyPgoKPGJyPgoKTG9va2luZyBhdCB0aGUgcmF3IGhpc3RvcmljYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gaW5mZWN0aW9ucyByYXRlcyBhbmQgcHJpY2VzLCB3ZSBsb29rIGF0IHRoZSB0cmVuZCBsaW5lIG9mIHByaWNlIHZzIGRhaWx5IGluZmVjdGlvbnMgKHJocykgYW5kIGEgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBwcmljZSBkaXN0cmlidXRpb25zIG9mIHByZSBhbmQgcG9zdC1pbmZlY3Rpb25zIHBlcmlvZCAobGhzKSwgd2Ugc2VlIGhpc3RvcmljYWxseSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbmZlY3Rpb25zIGFuZCBwcmljZS4gVGhvdWdoIHRoZXNlIGdyYXBocyBhcmUgcHJvbWlzaW5nLCBpdCBpcyB1bmNsZWFyIGlmIG90aGVyIGZhY3RvcnMgY291bGQgYmUgaW5mbHVlbmNpbmcgdGhpcyByZWxhdGlvbnNoaXAuIFRvIGVzdGFibGlzaCAgCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0Nvcm9uYV9HZW5lcmFsL0luZmVjdF9wcmljZV9jb21iby5wbmcpe3dpZHRoPTk5JX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA2LjEuMyBPTFMgTW9kZWxpbmcKU2luY2UgZGlzcGxheWluZyB0aGUgZnVsbCBPTFMgb3V0cHV0IGZvciBldmVyIHNlY3Rpb24gaXMgaW1wcmFjdGljYWwsIEkgd2lsbCBpbmNsdWRlIGEgc3VtbWFyaXplZCB2ZXJzaW9uIHdpdGggdGhlIG9ubHkgdGhlIGtleSB2YXJpYWJsZXMgaW5jbHVkZWQuIFBsZWFzZSBub3RlIHRoYXQgaWYgeW91IHdpc2ggdG8gc2VlIGVhY2ggcmVncmVzc2lvbiBvdXRwdXQgdGFibGUsIGNvZGUsIGFuZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRoZXNpcywgeW91IGNhbiB2aXNpdCBteSBHaXRIdWIgcmVwb3NpdG9yeSB3aXRoIHRoZSBmb2xsb3dpbmcgbGluazogaHR0cHM6Ly9naXRodWIuY29tL1Nhd2JlbnNvbjE1L0hQTV9UaGVzaXMuCgo+IEluIHRoZSBmdWxseSBjb250cm9sbGVkIEFscGhhIG1vZGVsLCB0aGUgYmV0YSBjb2VmZmljaWVudCBmb3IgZGFpbHkgaW5mZWN0aW9ucyBzaG93cyB0aGF0IGVhY2ggYWRkaXRpb25hbCBpbmZlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGF2ZXJhZ2UgaG9tZSBwcmljZSAqaW5jcmVhc2Ugb2YgJDguOTcqLCBjZXRlcmlzIHBhcmFidXMuIFRoaXMgZmluZGluZyBpcyBzaWduaWZpY2FudCBhdCB0aGUgKnAgPCAwLjAwKiBsZXZlbCAgIAoKVGhpcyBmb3VuZGF0aW9uYWwgZmluZGluZyBsYXlzIHRoZSBncm91bmR3b3JrIGZvciB0aGUgZm9sbG93aW5nIHJlc3VsdHMsIHdoaWNoIGF0dGVtcHQgdG8gZXhwbGFpbiB0aGUgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gaW5mZWN0aW9ucyBhbmQgcHJpY2UgYXQgdGhlIGxldmVsIG9mIGluZGl2aWR1YWwgaGVkb25pYyB2YXJpYWJsZXMuICAKCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQ29yb25hX0dlbmVyYWwvc3VtbWFyeV9PTFMucG5nKXt3aWR0aD00MCV9CjwvY2VudGVyPgoKPGJyPjxicj4KClRoZSBmb2xsb3dpbmcgZ3JhcGhpYyBzaG93cyB0aGUgaGlzdG9yaWNhbCB0cmVuZCBsaW5lIGZvciBpbmZlY3Rpb24gdnMgc29sZCBwcmljZSB3aXRoIDFTRCBlcnJvciBtYXJnaW5zIChncmV5KSwgdGhlIGJlc3Qgc2luZ2xlLXZhcmlhYmxlIGZpdCAoZ3JlZW4pLCBhbmQgdGhlIG1hcmdpbmFsIGZpdCBvZiB0aGUgQWxwaGEgbW9kZWwgKGJsdWUpLiBXZSBzZWUgdGhhdCB0aGUgY29udHJvbHMgb2YgdGhlIEFscGhhIG1vZGVsIGhhdmUgZmxhdHRlbiB0aGUgbWFyZ2luYWwgZWZmZWN0IG9mIGVhY2ggYWRkaXRpb25hbCBpbmZlY3Rpb24gb24gcHJpY2UsIGhvd2V2ZXIsIHRoaXMgcmVsYXRpb25zaGlpcCByZW1haW5zIHBvc2l0aXZlIGFuZCBzaWduaWZpY2FudCwgYXMgcHJldmlvdXNseSBlc3RhYmxpc2hlZC4gIAoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9Db3JvbmFfR2VuZXJhbC9Db3JvbmFfcHJpY2VfT0xTRml0LnBuZyl7d2lkdGg9NTUlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMjIDYuMS40IE1MIE1vZGVsaW5nClRvIGZ1cnRoZXIgdGVzdCB0aGUgcmVsZXZhbmNlIG9mIGNvcm9uYSBpbmZlY3Rpb25zIGluIGRldGVybWluaW5nIHByaWNlcywgd2UgbG9vayBhdCB0aGlzIHZhcmlhYmxlJ3MgcmVsYXRpdmUgcmFua2luZyBiYXNlZCBpdCdzIGFiaWxpdHkgdG8gaW1wcm92ZSBvdXQtb2Ytc2FtcGxlIHByZWRpY3Rpb25zIHdpdGhpbiBvdXIgWEdib29zdCBtb2RlbC4gVGhpcyBtZWFzdXJtZW50IGlzIGNhbGxlZCBWYXJpYWJsZSBJbXBvcnRhbmNlLiAKCldlIHNlZSB0aGF0IG9mIHRoZSAxMDQgdW5pcXVlIHZhcmlhYmxlcyBvZmZlcmVkIHRvIHRoZSBYR0Jvb3N0IG1hY2hpbmUsIHRoZSAzLW1vbnRoIG1vdmluZyBhdmVyYWdlIG9mIGluZmVjdGlvbiB3YXMgdGhlIDE5dGggbW9zdCBkZXNjcmlwdGl2ZSB2YXJpYWJsZSBpbiBwcmVkaWN0aW5nIHByaWNlcy4gVGhpcyBpcyBhbiB2ZXJ5IHN0cm9uZyBjb25maXJtYXRpb24gdGhhdCB0aGUgcmVsYXRpb25zaGlwIGZvdW5kIGluIHRoZSBPTFMgbW9kZWwgaXMgY29ycmVjdC4gCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0Nvcm9uYV9HZW5lcmFsL1Zhcl9JbXBvcnRhbmNlLnBuZyl7d2lkdGg9OTAlfQo8L2NlbnRlcj4KClRvIGdldCBhIGRldGFpbGVkIHVuZGVyc3RhbmRpbmcgb2YgdGhlIG1hcmdpbmFsIGVmZmVjdCBlYWNoIGFkZGl0aW9uYWwgaW5mZWN0aW9uIGhhcyBvbiBwcmljZSB0aHJvdWdoLCB3ZSBsb29rIGF0IHRoZSBQRFAgYW5kIHRoZSBJQ0Ugb2YgaW5mZWN0aW9ucyBhbmQgcHJpY2UuIFRoZSBQRFAgKHRvcCkgc2hvd3MgdGhlIG9wdGltYWwgcHJpY2UgY2hhbmdlIHcuci50LiBkYWlseSBpbmZlY3Rpb25zIHdoaWNoIG1pbmltaXplIHRoZSBtb2RlbCdzIHRlc3QgTVNFLiBUaGUgSUNFIChib3R0b20pIGlzIHRoZSBpbmRpdmlkdWFsIFBEUCBmb3IgZXZlcnkgb2JzZXJ2YXRpb24gaW4gdGhlIGRhdGFzZXQsIGNlbnRlcmVkIGF0IGluZmVjdGlvbiA9IDAuIFRoaXMgYWxsb3dzIHVzIHRvIHVuZGVyc3RhbmQgdGhlIHNpbXBsZSBQRFAgaW4gbW9yZSBkZXRhaWwgYW5kIGFsc28gdG8gcGljayB1cCBvbiBhbnkgc2lnbnMgb2YgaGV0ZXJvc2tlZGFzdGljaXR5IGFtb3VuZyBpbmRpdmlkdWFsIHNhbXBsZSBwcmVkaWN0aW9ucy4gCgpUaGUgUERQIHNob3dzIHRoYXQgb24gYXZlcmFnZSwgYW4gaW5jcmVhc2UgaW4gcHJpY2UgYXQgZXZlcnkgbGV2ZWwgb2YgZGFpbHkgaW5mZWN0aW9ucyA+IDAgcmVkdWNlcyB0ZXN0IE1TRS4gRnVydGhlcm1vcmUsIHRoaXMgdHJlbmQgaXMgZ2VuZXJhbGx5IHVwd2FyZCBmYWNpbmcsIHdpdGggYSBub3RhYmxlIHJhbmdlIG9mIHJlc3BvbnNlIGJldHdlZW4gMSw4MDAgYW5kIDIsNTAwIGluZmVjdGlvbnMsIHdoaWNoIEkgcmVmZXJlZCB0byBhcyB0aGUgKmluZmVjdGlvbnMtcHJpY2UgcmlkZ2UuKiBEaXNjdXNzaW9ucyByZWdhcmRpbmcgcG9zc2libGUgZXhwbGFuYXRpb25zIGZvciB0aGUgZ2VuZXJhbCBzaGFwZSBvZiB0aGlzIHJlZ2lvbiB3aWxsIGJlIGV4cGxvcmVkIGluIHNlY3Rpb24gNy4gICAgIAoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9Db3JvbmFfR2VuZXJhbC9QRFBfSUNFX2dlbmVyYWwucG5nKXt3aWR0aD04MCV9CjwvY2VudGVyPgoKPGJyPgoKIyMjIyA2LjIgQ292aWQtMTk6IFByZW1pdW0gZm9yIEJlZHJvb21zCiMjIyMjIDYuMi4xIFN1bW1hcnkgb2YgRmluZGluZ3MKCj4gVGhlcmUgYXJlIHR3byBjb250ZXh0dWFsIGRldGFpbHMgd2hpY2ggbXVzdCBiZSBjb25zaWRlcmVkIGZvciBvbmUgdG8gYXBwcm9wcmlhdGx5IGludGVycHJldCB0aGUgZm9sbG93aW5nIGZpbmRpbmdzLiBGaXJzdCwgbnVtYmVyIG9mIGJlZHJvb21zIGFuZCB0aGUgdG90YWwgbGl2aW5nIGFyZWEgb2YgYSBob21lIGFyZSBoaWdobHkgY29ycmVsYXRlZCwgYW5kIHRoZXJlZm9yZSB3aGVuIHRvdGFsIGxpdmluZyBhcmVhIGlzIGluY2x1ZGVkLCB0aGUgYmV0YSBjb2VmZmljaWVudHMgZm9yIGVhY2ggbGV2ZWwgb2YgYmVkcm9vbSByZXByZXNlbnRzIG9ubHkgdGhlIHByZW1pdW0gaG9tZW93bmVycyBhcmUgd2lsbGluZyB0byBwYXkgZm9yIHRoZSBhY3R1YWwgZmVhdHVyZSBvZiBhbiBleHRyYSBiZWRyb29tLCBhbmQgbm90IHRoZSBleHRyYSBsaXZpbmcgYXJlYSBpdHNlbGYuIFRoaXMgd2lsbCBtYWtlIHByZW1pdW1zIHNlZW0gbG93LiBTZWNvbmRseSwgdGhlIE9MUyByZXN1bHRzIGxpc3RlZCBiZWxvdyByZXByZXNlbnQgdGhlIGNoYW5nZSBpbiB0aGUgYmV0YSBjb2VmZmljaWVudHMgZnJvbSBwb3N0IGFuZCBwcmUgY29yb25hLCBub3QgdGhlIGFic29sdXRlIGVmZmVjdCwgYXMgaW4gdGhlIGNhc2Ugb2YgbWVhc3VyaW5nIGRhaWx5IGluZmVjdGlvbiBhbG9uZS4gICAgIAo+Cj4gUHJlbGltaWxhcnkgZmluZGluZyBzaG93IHRoYXQgdGhlIHByaWNlIGRpc3RyaWJ1dGlvbiBmb3IgZXZlcnkgbGV2ZWwgb2YgbnVtYmVyIG9mIGJlZHJvb21zIGluY3JlYXNlZCBhZnRlciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmZlY3Rpb24gcGVyaW9kIChpLmUuIGFjY3VtdWxhdGlvbiBvZiBpbmZlY3Rpb25zID49IDEwMDApCj4KPiBUaGUgZnVsbHkgY29udHJvbGVkIEFscGhhIG1vZGVsIHJlc3VsdHMgc2hvdyB0aGF0IHRoZSBwcmVtaXVtIGZvciBlYWNoIGxldmVsIG9mIG51bWJlciBvZiBiZWRyb29tcyBtb2Rlc3RseSBpbmNyZWFzZWQgaW4gcmVzcG9uc2UgdG8gZGFpbHkgaW5mZWN0aW9uLiBFdmVyeSBjb3JvbmEtZHJpdmVuIGluY3JlYXNlIGlzIHNpZ25pZmljYW50IGF0IHRoZSBwIDwgMC4wNSBsZXZlbCBleGNlcHQgZm9yIHNpbmdsZSBiZWRyb29tIGhvbWVzLiBQb3NzaWJsZSB0aGVvcmllcyBmb3Igd2h5IHRoaXMgc2hpZnQgaGFwcGVuZWQgaXMgZXhwbG9yZWQgaW4gc2VjdGlvbiA3LgoKCiMjIyMjIDYuMi4yIFZpc3VhbCBSZXZpZXcKR2VuZXJhbCBkaXN0cmlidXRpb24gb2YgYmVkcm9vbXMgcGVyIGhvdXNlCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0JlZHMvYmVkX2Rpc3RfZ2VuLnBuZyl7d2lkdGg9ODAlfQo8L2NlbnRlcj4KCjxicj4KCkRpc3RyaWJ1dGlvbnMgb2YgcHJpY2UgYXQgZWFjaCBudW1iZXIgb2YgYmVkcm9vbXMgKGxocykgYW5kIHRoZSBzYW1lIHBsb3QgYnV0IHNwbGl0IG9yIGJlZm9yZSBhbmQgYWZ0ZXIgaW5mZWN0aW9ucyBwZXJpb2QgKHJocykKCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQmVkcy9iZWRfY29tYmluZWQucG5nKXt3aWR0aD0xMDAlfQo8L2NlbnRlcj4KCjxicj4KCkhvd2V2ZXIsIGl0IGlzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IHNpemUgKGkuZS4gdG90YWwgbGl2aW5nIGFyZWEpIGlzIGNvbnRyb2xsZWQgZm9yIGluIHRoZSBBbHBoYSBtb2RlbC4gVGhlcmVmb3JlLCBpdCBpcyBtb3JlIGFjY3VyYXRlIHRvIGxvb2sgYXQgdGhlIHNhbWUgdHdvIHBsb3RzIGFib3ZlLCBidXQgbm9ybWFsaXplZCBwZXIgc3F1YXJlIGZvb3QuIFdlIHNlZSBhIHNpZ25pZmljYW50IGZsYXR0ZW5pbmcgYmV0d2VlbiBlYWNoIG51bWJlciBvZiBiZWRyb29tcyBsZXZlbCwgaG93ZXZlciwgYSBkaXN0aW5jdCBjaGFuZ2UgZnJvbSBwcmUgdnMgcG9zdCBpbmZlY3Rpb24gcGVyaW9kIGlzIHN0aWxsIHZpc2libGUgKHJocykuIFRoZSBuZXh0IHNlY3Rpb24gd2lsbCB0ZXN0IGlmIHRoaXMgc2hpZnQgZnJvbSBwb3N0IHRvIHByZS1jb3JvbmEgaXMgc2lnbmlmaWNhbnRseSBpbiBnZW5lcmFsLCBhbmQgc2lnbmlmaWNhbnRseSByZWxhdGVkIHRvIGRhaWx5IGluZmVjdGlvbnMuCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0JlZHMvYmVkX3Bwc2ZfY29tYmluZWQucG5nKXt3aWR0aD0xMDAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMjIDYuMi4zIE9MUyBNb2RlbGluZwpJbnRlcnByZXRhdGlvbiB1bmRlciBjb25zdHJ1Y3Rpb24KCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQmVkcy9PTFNfT3V0cHV0LnBuZyl7d2lkdGg9NTAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMjIDYuMi40IE1MIE1vZGVsaW5nCkR1ZSB0byBudW1iZXIgb2YgYmVkcm9vbXMgYmVpbmcgY2F0ZWdvcmljYWwsIHRoZSByZXN1bHRzIG9mIHRoZSBYR0Jvb3N0IG1vZGVsIGZvciB0aGVzZSB2YXJpYWJsZXMgYXJlIG5vdCBhcyBlYXNpbHkgdmlzdWFsbHkgcmVwcmVzZW50ZWQgYXMgY29udGludW91cyB2YXJpYWJsZXMsIHdoaWNoIGhhdmUgY2VsYXIgUERQcy4gSG93ZXZlciwgd2UgY2FuIGNvbnNpZGVyIHRoZSByZXN1bHRzIGluIHdyaXR0ZW4gZm9ybSBhbmQgd2l0aCBpbXBvcnRhbmNlIHJhbmtpbmcuIAoKVGhlIHZhcmlhYmxlIGltcG9ydGFuY2UgcmFua2luZyBvZiBlYWNoIGZhY3RvciBsZXZlbCBmcm9tIDEtdGhyb3VnaC01IGJlZHJvb21zIGlzIDg0LCA2MCwgNDcsIDM0LCBhbmQgNjggcmVzcGVjdGl2ZWx5LiBUaGlzIHJlbGF0aXZlbHkgbG93IHJlbGV2YW5jZSBpcyBleHBlY3RlZCwgYXMgbXVjaCBvZiB0aGUgZXhwbGFuYXRvcnkgcG93ZXIgb2YgYmVkcm9vbXMgb24gcHJpY2UgaXMgdGFrZW4gYnkgdG90YWwgbGl2aW5nIGFyZWEsIHJhbmtlZCBudW1iZXIgMSBpbiBpbXBvcnRhbmNlLgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9CZWRzL2JlZHNfaW1wb3J0YW5jZS5wbmcpe3dpZHRoPTYwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIDYuMyBDb3ZpZC0xOTogUHJlbWl1bSBmb3IgQ2l0eSBDZW50cmFsaXR5CiMjIyMjIDYuMy4xIFN1bW1hcnkgb2YgRmluZGluZ3MKCgoKIyMjIyMgNi4zLjIgVmlzdWFsIFJldmlldwo8YnI+CgpCZWxvdyB3ZSBzZWUgYSBsZWZ0d2FyZCBzaGlmdCBvZiB0aGUgcHJpY2UgZGlzdHJpYnV0aW9uIGZvciBwcm9wZXJ0aWVzIHRoYXQgYXJlIGxvY2F0ZWQgd2l0aGluIGNpdHkgbGltaXRzIChyaHMpLiAgCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQ2l0eS90b3RhbF9kaXN0LnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgpUbyBiZXR0ZXIgdW5kZXJzdGFuZCB0aGUgZWZmZWN0IGNvcm9uYSBoYWQgb24gcHJvcGVydGllcyBzcGVjaWZpY2FsbHkgbG9jYXRlZCB3aXRoaW4gY2l0eSBsaW1pdHMsIHdlIGZ1cnRoZXIgc3BsaXQgdGhlIGNpdHlfbGltaXRzIGRpc3RyaWJ1dGlvbiBieSBpbmZlY3Rpb24gcGVyaW9kcy4gVGhpcyBzZXBhcmF0aW9uIHNob3dzIGEgY2xlYXIgIAo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0NpdHkvY2l0eV9kaXN0LnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+Cjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQ2l0eS9jaXR5X2xpbWl0c19hbmRfY29yb25hLnBuZyl7d2lkdGg9ODAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMjIDYuMy4zIE9MUyBNb2RlbGluZwo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0NpdHkvT0xTLnBuZyl7d2lkdGg9NTAlfQo8L2NlbnRlcj4KCjxicj4KCgojIyMjIyA2LjMuNCBNTCBNb2RlbGluZwo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0NpdHkvQ2l0eV9QRFAucG5nKXt3aWR0aD01MCV9CjwvY2VudGVyPgoKPGJyPgoKIyMjIyA2LjQgQ292aWQtMTk6IFByZW1pdW0gZm9yIFNpemUKIyMjIyMgNi40LjEgU3VtbWFyeSBvZiBGaW5kaW5ncwoKCgojIyMjIyA2LjQuMiBWaXN1YWwgUmV2aWV3ClRvdGFsIGxpdmluZyBhcmVhIAoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9MaXZpbmdfYXJlYS9hcmVhX2Rpc3RfdG90YWxfY29tLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+Cjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvTGl2aW5nX2FyZWEvYXJlYV9kaXN0X3ByaWNlX2Nvcm9uYWEucG5nKXt3aWR0aD03MCV9CjwvY2VudGVyPgoKPGJyPgoKIyMjIyMgNi40LjMgT0xTIE1vZGVsaW5nCgo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0xpdmluZ19hcmVhL2FyZWFfdG90YWwucG5nKXt3aWR0aD01MCV9CjwvY2VudGVyPgoKPGJyPgoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9MaXZpbmdfYXJlYS9TY3JlZW4gU2hvdCAyMDIyLTAyLTA2IGF0IDE4LjM2LjQ2LnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA2LjQuNCBNTCBNb2RlbGluZwo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0xpdmluZ19hcmVhL2FyZWFfUERQLnBuZyl7d2lkdGg9OTAlfQo8L2NlbnRlcj4KCjxicj4KCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvTGl2aW5nX2FyZWEvYXJlYV9oZWF0X2NvbS5wbmcpe3dpZHRoPTEwMCV9CjwvY2VudGVyPgoKPGJyPgoKCiMjIyMgNi41IENvdmlkLTE5OiBQcmVtaXVtIGZvciBBZ2UgCiMjIyMjIDYuNS4xIFN1bW1hcnkgb2YgRmluZGluZ3MKIyMjIyMgNi41LjIgVmlzdWFsIFJldmlldwo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0FnZS9hZ2VfZGlzdHNfY29tLnBuZyl7d2lkdGg9OTAlfQo8L2NlbnRlcj4KCjxicj4KCiMjIyMjIDYuNS4zIE9MUyBNb2RlbGluZwo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0FnZS9hZ2VfZ2VuLnBuZyl7d2lkdGg9NTAlfQo8L2NlbnRlcj4KCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQWdlL2FnZV9vbHNfY29tLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgojIyMjIyA2LjUuNCBNTCBNb2RlbGluZwo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0FnZS9hZ2VfUERQLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+Cjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvQWdlL2FnZV9oZWF0X2NvbS5wbmcpe3dpZHRoPTEwMCV9CjwvY2VudGVyPgoKPGJyPgoKIyMjIyA2LjYgQ292aWQtMTk6IENoYW5nZSBpbiBEYXlzIG9uIE1hcmtldAojIyMjIyA2LjYuMSBTdW1tYXJ5IG9mIEZpbmRpbmdzCiMjIyMjIDYuNi4yIFZpc3VhbCBSZXZpZXcKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9Eb20vZG9tX2Rpc3RfY29tLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgoKIyMjIyMgNi42LjMgT0xTIE1vZGVsaW5nCjxicj4KCjxjZW50ZXI+CiFbXSgvVXNlcnMvc2F3eWVyYmVuc29uL0RvY3VtZW50cy9NYXN0ZXIgVGhlc2lzL0hQTV9UaGVzaXMvV3JpdGluZyAmIExpdGVyYXR1cmUvR3JhcGhpY3MgZnJvbSBwcHR4L1Jlc3VsdHMvRG9tL2RvbV9nZW4ucG5nKXt3aWR0aD01MCV9CjwvY2VudGVyPgoKPGJyPgoKPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9Eb20vZG9tX2NvbS5wbmcpe3dpZHRoPTEwMCV9CjwvY2VudGVyPgoKPGJyPgoKCgojIyMjIyA2LjYuNCBNTCBNb2RlbGluZwo8YnI+Cgo8Y2VudGVyPgohW10oL1VzZXJzL3Nhd3llcmJlbnNvbi9Eb2N1bWVudHMvTWFzdGVyIFRoZXNpcy9IUE1fVGhlc2lzL1dyaXRpbmcgJiBMaXRlcmF0dXJlL0dyYXBoaWNzIGZyb20gcHB0eC9SZXN1bHRzL0RvbS9kb21fUERQLnBuZyl7d2lkdGg9NzAlfQo8L2NlbnRlcj4KCjxicj4KPGJyPgoKPGNlbnRlcj4KIVtdKC9Vc2Vycy9zYXd5ZXJiZW5zb24vRG9jdW1lbnRzL01hc3RlciBUaGVzaXMvSFBNX1RoZXNpcy9Xcml0aW5nICYgTGl0ZXJhdHVyZS9HcmFwaGljcyBmcm9tIHBwdHgvUmVzdWx0cy9Eb20vZG9tX2hlYXRfY29tLnBuZyl7d2lkdGg9MTAwJX0KPC9jZW50ZXI+Cgo8YnI+CgoKIyMjIyA2LjcgU3VtbWFyeSBvZiBSZXN1bHRzIGFuZCBIeXBvdGhlc2lzIAoKCgoKPGJyPjxicj4KCiMjIyA3LiBEaXNjdXNzaW9uCgo8YnI+PGJyPgoKIyMjIDguIENvbmNsdXNpb24KCjxicj48YnI+CgojIyMgOS4gQmlibGlvZ3JhcGh5Cgo8YnI+PGJyPgoKIyMjIDkuIEFwcGVuZGl4Cgo8YnI+PGJyPgoKIyMjIyBHZW5lcmFsIE5vdGVzIGFuZCBUb2RvcwogCiAqIFBvc3NpYmx5IHdyaXRlIGluIExhVGV4PwogKiBKdXN0IHdyaXRlIGNvdmVyIGxldHRlciBpbiB3b3JkIGFuZCBjb21iaW5lIFBERj8KICogQ29tcGxldGUgZ2VuZXJhbCBTdHJ1Y3R1cmUKICogU2VsZWN0IHN5c3RlbSBmb3IgbWFuYWdpbmcgcmVmZXJlbmNlcwogKiBHZXQgY29uZmlybWF0aW9uIG9uIHRpdGxlIGNoYW5nZSBmcm9tIFByw7xmdW5nc2FtdAogKiBQb3NzaWJsZSBhZGRpdGlvbmFsIGRhdGEKICAgKyBJbmNsdWRlIENvdmlkIGNhc2VzIGluIExhIGJ5IGRhdGU/CiAgICsgQ3JpbWUgc3RhdHM/CiAgICsgUmFjaWFsIFN0YXRzPwogKiBJbmNsdWRlIHRoZSB0ZXJtcwogICArIEJpZyBEYXRhCiAqIEJ1aWxkIHNvbWUgZ3JhcGhpY3MgaW4gcHB0eCBhbmQgaW1wb3J0IHRoZW0gYXMgaW1hZ2VzCiAqIFdlYiBzY3JhcHBpbmcgZm9yIGFkZGl0aW9uYWwgZGF0YSBzZXRzPwogKiBHcmFwaCB3aXRoICoqREFURSoqIGFzIHZhcmlhYmxlCiAqIE1ha2UgR2VybWFuIHN0dWR5IGluIEdlcm1hbgogKiBSZXBsaWNhdGUgd2l0aCBvdGhlciBkYXRhIHNldHMKICogQ2hlY2sgZm9yIHBsYWdpYXJpc20gCiAqIE1ha2UgdmlkZW8gZXhwbGFpbmluZyB0aGVzaXMgZm9yIHByb2YuIGdyYWRpbmcKCiMjIyMgSGVscGZ1bCBOb3RlcwoKMS4gRGVmaW5lIHRoZSBjZW50cmFsIGNvbmNlcHRzIHVzZWQgZWFybHkgb24KMi4gU3RhcnQgZWFjaCBjaGFwdGVyIHdpdGggYSBzbWFsbCBpbnRyb2R1Y3Rpb24gYW5kIGVuZCBpdCB3aXRoIGEgYnJpZWYgc3VtbWFyeSBvZiByZXN1bHRzCjMuIFByb3ZpZGUgYW4gb3V0bG9vayBvZiB0aGUgZnV0dXJlIGRldmVsb3BtZW50cyBvZiB0aGUgcGFydGljdWxhciBzY2llbnRpZmljIGRpc2N1c3Npb24sIGRpc2N1c3MgcG9saWN5IGltcGxpY2F0aW9ucyBhbmQgcG9pbnQgb3V0IG9wZW4gcXVlc3Rpb25zLgoKIyMjIyBQbGF5Z3JvdW5kCgpgYGB7cn0KCmBgYAoKCjxicj48YnI+PGJyPgoKRW5kIG9mIERvY3VtZW50CgoK